C++STL之Vector向量详解,用法和例子 一起学习 一起加油
C++ STL之vector用法总结
- 1.vector是可变大小数组的序列容器
- 2.像数组一样,vector也采用连续储存空间来储存元素,就是说可以采用下标
- 对数组进行访问,大小可变,会被容器自动处理
- 3.本质讲,vector使用动态分配数组来存储它的元素。
- 当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。
- 其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,
- 这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,
- vector并不会每次都重新分配大小。
- 4.与其它动态序列容器相比(deques, lists and forward_lists),
- vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。
- 对于其它不在末尾的删除和插入操作,效率更低。
- 比起lists和forward_lists统一的迭代器和引用更好。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//vector的声明及初始化
vector<int> vec; //声明一个int型向量
vector<int> vec1(); //声明一个初始大小为5的int向量
vector<int> vec2(, ); //声明一个初始大小为10且值都为1的向量
vector<int> vec3(vec1); //声明并用vec1向量初始化vec3向量
vector<int> tmp(vec2.begin(), vec2.begin() + ); //用向量vec的第0个到第二个初始化tmp
int arr[] = { ,,,, };
vector<int> vec4(arr, arr+); //将arr数组的元素用于初始化vec向量
//说明::::不包括arr[4]元素,末尾指针都是指结束元素的下一个元素
//为了和vec.end()指针统一
vector<int> vec5(arr, &arr[]);
//vector基本操作
//1.容量
/*
向量大小:vec.size()
向量最大容量:vec.max_size()
更改向量大小: vec.resize()
向量真实大小: vec.cappcity()
向量判空: vec.empty()
减少向量大小到满足元素所占储存空间的大小 : vec.shrink_to_fit();
*/
测试代码
void main() {
cout << vec4.size() << ends <<vec4.capacity() <<ends<<vec.max_size()<< endl;
cout << vec4.empty() << endl; //空为1,非空为0
cout << vec.empty() << endl;
vec.push_back();
for (int i = ; i < ; i++)
{
vec.push_back(i);
}
cout << vec.size() << ends << vec.capacity() << endl;
vec.shrink_to_fit();
cout << vec.capacity() << endl;
for(int i=;i<vec4.size();i++)
cout << vec4[i] << endl;
for (int i = ; i<vec5.size(); i++)
cout << vec5[i] << endl;
}
//2.修改
/*
多个元素赋值: vec.assign() //类似与初始化时用数组赋值
末尾添加元素:vec.push_back()
末尾删除元素 vec.pop_back()
任意位置插入元素 vec.insert()
任意位置删除元素: vec.erase()
交换两个向量元素 vec.swap()
清空向量元素 vec.clear()
*/
测试代码
int main() {
int i;
vec2=vec4; //vector可以直接用另一个赋值;
for (i = ; i < vec2.size(); i++) {
cout << vec2[i] << endl;
}
cout << vec2.size() << ends << vec2.capacity() << endl;
//vector assign() 的三种用法
vec2.assign(,); //3个7
vec2.assign(arr, arr + ); //迭代器 数组名 0 1 2 不包括arr+3
vec2.assign({ ,, }); //无名数组的方法进行赋值
//vector insert()函数的三种用法
vector<char> avector;
for (int i = ; i < ; i++) {
avector.push_back(i + );
}
avector.insert(avector.begin(), , 'C');// 1. 在指定loc 前插入val元素,返回指向这个元素的迭代器
avector.insert(avector.begin() + , ); //2. 在指定位置loc前插入num个值为val的元素
avector.insert(avector.begin()+,avector.begin(),avector.end()); //3.在指定位置loc前插入区间(start,end) 的所有元素
vector<char>::iterator it = avector.begin();
for (; it != avector.end(); it++) {
cout << *it << ends;
}
cout << endl;
//vector erase()函数的用法
//earse的返回值是返回被删除元素向后的一个元素
//vector中erase的作用是删除掉某个位置position或一段区域
//(begin, end)中的元素,减少其size。
for (it = avector.begin(); it != avector.end();) {
it = avector.erase(it);
}
for (; it != avector.end(); it++) {
cout << *it << ends;
}
cout << endl;
//vector swap()用法
cout << tmp.size() << ends << tmp.capacity() << endl;
tmp.erase(tmp.begin()+);
cout << tmp.size() << ends << tmp.capacity() << endl;
tmp.swap(vec);
cout << tmp.size() << ends << tmp.capacity() << endl;
for (i = ; i < vec2.size(); i++) {
cout << vec2[i] << endl;
}
vec2.shrink_to_fit();
cout << vec2.size() << ends << vec2.capacity() << endl;
return ;
}
//3.迭代器
/*
开始指针vec.begin()
末尾指针: vec.end()
指向常量的开始指针: vec.cbegin()
指向常量的末尾指针: vec.cend()
*/
//4.元素的访问
/*
下标访问: vec[1] //并不会检查是否越界
at方法访问: vec.at[1] //两者的区别就是at会检查是否越界,
是就会抛出out of range异常
访问第一个元素: vec.front()
访问最后一个元素: vec.back()
******* C++11的特性
返回一个指针: int*p=vec.data() // vector在内存中是一个数组,
可以返回一个指针指向这个数组
*/
测试代码
int main() {
vector<char> ave,ml;
for (int i = ; i < ; i++) {
ave.push_back(i + );
}
vector<char>::iterator it = ave.begin();
for (; it != ave.end(); it++) {
cout << *it << ends;
}cout << endl;
//元素翻转
reverse(ave.begin(), ave.end());
for (it = ave.begin(); it != ave.end(); it++) {
cout << *it << ends;
}cout << endl;
//reverse_copy() reverse_copy(sourceBeg,sourceEnd,destBeg)
//将源区间soureBeg sourceEnd 内的元素复制到以destBeg起始的目标区间
//并颠倒安置次序
reverse_copy(ave.begin(), ave.end(),ml.begin());
//元素排序
//sort(vec.begin(), vec.end());
for (it = ml.begin(); it != ml.end(); it++) {
cout << *it << ends;
}cout << endl;
return ;
}
本人水平有限如有问题欢迎指出
C++STL之Vector向量详解,用法和例子 一起学习 一起加油的更多相关文章
- 跟我一起学STL(2)——vector容器详解
一.引言 在上一个专题中,我们介绍了STL中的六大组件,其中容器组件是大多数人经常使用的,因为STL容器是把运用最广的数据结构实现出来,所以我们写应用程序时运用的比较多.然而容器又可以序列式容器和关联 ...
- STL之vector容器详解
vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说: ...
- [转]STL之vector容器详解
vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说: ...
- C++中的STL中map用法详解(转)
原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解 Map是STL的一个关联容器,它提供 ...
- 2.3 C++STL vector容器详解
文章目录 2.3.1 引入 2.3.2 代码实例 2.3.3 运行结果 总结 2.3.1 引入 vector 容器 动态数组 可变数组 vector容器 单口容器(尾部操作效率高) vector动态增 ...
- STL priority_queue 常见用法详解
<算法笔记>学习笔记 priority_queue 常见用法详解 //priority_queue又称优先队列,其底层时用堆来实现的. //在优先队列中,队首元素一定是当前队列中优先级最高 ...
- STL set 常见用法详解
<算法笔记>学习笔记 set 常见用法详解 set是一个内部自动有序且不含重复元素的容器 1. set 的定义 //单独定义一个set set<typename> name: ...
- C++ vector类详解
转自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vec ...
- STL stack 常见用法详解
<算法笔记>学习笔记 stack 常见用法详解 stack翻译为栈,是STL中实现的一个后进先出的容器.' 1.stack的定义 //要使用stack,应先添加头文件#include &l ...
随机推荐
- C++类中静态变量和普通变量的区别
静态变量: 1.静态变量会被编到程序的exe里面,从程序启动到结束,它一直存在: 2.静态变量的初始化值为0: 3.全局变量默认是静态变量: 4.在类中的函数变量前面加了static的也是静态变量,只 ...
- HEOI2018——welcome to NOI2018
我不得不和烈士和小丑走在同一道路上, 万人都要将火熄灭, 我一人独将此火高高举起, 我借此火得度一生的茫茫黑夜. ——海子 弹指一瞬间,翘首以盼的HEOI2018就来了. 我,一个滑稽的小丑,带 ...
- BZOJ_5301_[Cqoi2018]异或序列&&CF617E_莫队
Description 已知一个长度为 n 的整数数列 a[1],a[2],…,a[n] ,给定查询参数 l.r ,问在 [l,r] 区间内,有多少连续子 序列满足异或和等于 k . 也就是说,对于所 ...
- Java中的异常简介
Java中异常的分类 Java中的异常机制是针对正常运行程序的一个必要补充,一般来说没有加入异常机制,程序也能正常运营,但是,由于入参.程序逻辑的严谨度,总会有期望之外的结果生成,因此加入异常机制的补 ...
- OsharpNS轻量级.net core快速开发框架简明入门教程-从零开始启动Osharp
OsharpNS轻量级.net core快速开发框架简明入门教程 教程目录 从零开始启动Osharp 1.1. 使用OsharpNS项目模板创建项目 1.2. 配置数据库连接串并启动项目 1.3. O ...
- .net core webapi 前后端开发分离后的配置和部署
背景:现在越来越多的企业都采用了在开发上前后端分离,前后端开发上的分离有很多种,那么今天,我来分享一下项目中得的前后端分离. B/S Saas 项目:(这个项目可以理解成个人中心,当然不止这么点功能 ...
- Keepalived部署与配置详解
Keepalive详解 工作原理 Keepalived本质就是为ipvs服务的,它也不需要共享存储.IPVS其实就是一些规则,Keepalived主要的任务就是去调用ipvsadm命令,来生成规则,并 ...
- 用Docker解决坑爹的环境搭建系列——postgresql
sudo docker pull postgres mkdir -p /data/docker/pgsql sudo docker run -p 54321:5432 --name pgsql -v ...
- 阿里云ecs centos7安装 postgresql 9.4
rpm -Uvh http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/pgdg-centos94-9.4-3.noarch.rpm yum insta ...
- Netty源码—六、tiny、small内存分配
tiny内存分配 tiny内存分配流程: 如果申请的是tiny类型,会先从tiny缓存中尝试分配,如果缓存分配成功则返回 否则从tinySubpagePools中尝试分配 如果上面没有分配成功则使用a ...