1. 什么是vector
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
2. 基本函数实现
2.1 构造函数
- vector(): 创建一个空vector
- vector(int nSize): 创建一个vector,元素个数为nSize
- vector(int nSize,const t& t): 创建一个vector,元素个数为nSize,且值均为t
- vector(const vector&): 复制构造函数
- vector(begin,end): 复制[begin,end)区间内另一个数组的元素到vector中
2.2 增加函数
- void push_back(const T& x): 向量尾部增加一个元素X
- iterator insert(iterator it,const T& x): 向量中迭代器指向元素前增加一个元素x
- iterator insert(iterator it,int n,const T& x): 向量中迭代器指向元素前增加n个相同的元素x
- iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
2.3 删除函数
- iterator erase(iterator it): 删除向量中迭代器指向元素
- iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
- void pop_back(): 删除向量中最后一个元素
- void clear(): 清空向量中所有元素
2.4 遍历函数
- reference at(int pos): 返回pos位置元素的引用
- reference front(): 返回首元素的引用
- reference back(): 返回尾元素的引用
- iterator begin(): 返回向量头指针,指向第一个元素
- iterator end(): 返回向量尾指针,指向向量最后一个元素的下一个位置
- reverse_iterator rbegin(): 反向迭代器,指向最后一个元素
- reverse_iterator rend(): 反向迭代器,指向第一个元素之前的位置
2.5 判断函数
- bool empty() const: 判断向量是否为空,若为空,则向量中无元素
2.6 大小函数
- int size() const: 返回向量中元素的个数
- int capacity() const: 返回当前向量张红所能容纳的最大元素值
- int max_size() const: 返回最大可允许的vector元素数量值
2.7 其他函数
- void swap(vector&): 交换两个同类型向量的数据
- void assign(int n,const T& x): 设置向量中第n个元素的值为x
- void assign(const_iterator first, const_iterator last): 向量中[first,last)中元素设置成当前向量元素
2.8 看着清楚
- push_back: 在数组的最后添加一个数据
- pop_back: 去掉数组的最后一个数据
- at: 得到编号位置的数据
- begin: 得到数组头的指针
- end: 得到数组的最后一个单元+1的指针
- front: 得到数组头的引用
- back: 得到数组的最后一个单元的引用
- max_size: 得到vector最大可以是多大
- capacity: 当前vector分配的大小
- size: 当前使用数据的大小
- resize: 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
- reserve: 改变当前vecotr所分配空间的大小
- erase: 删除指针指向的数据项
- clear: 清空当前的vector
- rbegin: 将vector反转后的开始指针返回(其实就是原来的end-1)
- rend: 将vector反转构的结束指针返回(其实就是原来的begin-1)
- empty: 判断vector是否为空
- swap: 与另一个vector交换数据
3. 用法与实例
#include < vector>
using namespace std;
3.1 vector 的初始化(举例说明)
- vector<int> a(10); //定义了10个整型元素的向量,不具有初值,其值不确定
- vector<int> a(10, 1); //定义了10个整型元素的向量,且给出每个元素的初值为1
- vector<int> a(b); //用b向量来创建a向量,整体复制性赋值
- vector<int> a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素
- int b[7]={1,2,3,4,5,9,8}; vector<int> a(b,b+7); //从数组中获得初值
- vector<vector<int> > vobj(N); //定义二维动态数组大小N行
- vector<vector<int> > vobj(N, vector<int>(M)); //定义二维动态数组N行M列
3.2 vector对象的常用内置函数使用(举例说明)
- a.assign(b.begin(), b.begin()+3); //b为向量,将b的0~2个元素构成的向量赋给a
- a.assign(4,2); //是a只含4个元素,且每个元素为2
- a.back(); //返回a的最后一个元素
- a.front(); //返回a的第一个元素
- a[i]; //返回a的第i个元素,当且仅当a[i]存在
- a.clear(); //清空a中的所有元素
- a.empty(); //判断a是否为空,空则返回ture,不空则返回false
- a.pop_back(); //删除a向量的最后一个元素
- a.erase(a.begin()+1,a.begin()+3); //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+ 3(不包括它)
- a.push_back(5); //在a的最后一个向量后插入一个元素,其值为5
- a.insert(a.begin()+1,5); //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
- a.insert(a.begin()+1,3,5); //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
- a.insert(a.begin()+1,b+3,b+6); //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8 ,插入元素后为1,4,5,9,2,3,4,5,9,8
- a.size(); //返回a中元素的个数;
- a.capacity(); //返回a在内存中总共可以容纳的元素个数
- a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,其值随机
- a.resize(10,2); //将a的现有元素个数调至10个,多则删,少则补,其值为2
- a.reserve(100); //将a的容量扩充至100,改变当前容器的最大容量(capacity),它不会生成元素.
- a.swap(b); //b为向量,将a中的元素和b中的元素进行整体性交换
- a==b; //b为向量,向量的比较操作还有!=,>=,<=,>,<
特别注意:
begin()与end()函数、front()与back()的差别:begin()与end()返回的是<迭代器>,front()与back()返回的是<引用>。begin()指向的是第一个一个元素的前一个位置,从第一个元素插入用begin()+1。end()指向的是最后一个元素的下一个位置,所以访问最后一个元素,所以 iter = v1.end()-1 是使iter指向最后一个元素 。
reverse() 与reserve()的区分:reverse()是倒置算法,reserve()是调整容量
size()与capacity()的区别:size()是元素长度,capacity()是容器容量
3.3 顺序访问vector的几种方式,举例说明
3.3.1 对向量a添加元素的几种方式
1.向向量a中添加元素
vector<int>a;
for(int i=0;i<10;++i){a.push_back(i);}
2.从数组中选择元素向向量中添加
int a[6]={1,2,3,4,5,6};
vector<int> b;
for(int i=0;i<=4;++i){b.push_back(a[i]);}
3.从现有向量中选择元素向向量中添加
int a[6]={1,2,3,4,5,6};
vector<int>b;
vector<int>c(a,a+4);
for(vector<int>::iterator it=c.begin();it<c.end();++it)
{
b.push_back(*it);
}
4.从文件中读取元素向向量中添加
ifstream in("data.txt");
vector<int>a;
for(int i;in>>i){a.push_back(i);}
5.常见错误赋值方式
vector<int>a;
for(int i=0;i<10;++i){a[i]=i;} //下标只能用来获取已经存在的元素
3.3.2 从向量中读取元素
1.通过下标方式获取
int a[6]={1,2,3,4,5,6};
vector<int>b(a,a+4);
for(int i=0;i<=b.size()-1;++i){cout<<b[i]<<endl;}
2.通过迭代器方式读取
int a[6]={1,2,3,4,5,6};
vector<int>b(a,a+4);
for(vector<int>::iterator it=b.begin();it!=b.end();it++){cout<<*it<<" ";}
3.3.3 几个常用的算法
#include<algorithm>
vector本身没有这些方法,其是依靠algorithm来实现的。
1)sort(); //排序
sort(a.begin(),a.end());
/* 对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列 */
2)reverse(); //倒置
reverse(a.begin(),a.end());
/* 把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素 */
3)copy(); //拷贝
copy(a.begin(),a.end(),b.begin()+1);
/* 把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素 */
4)find(); //查找
vector<int>::iterator it = find(a.begin(), a.end(), 6);
if (it != vec.end())
cout<<*it<<endl;
/* 在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的迭代器以供访问。 */
原文链接:
https://www.cnblogs.com/zsq1993/p/5929806.html
https://blog.youkuaiyun.com/weixin_41743247/article/details/90635931
https://blog.youkuaiyun.com/w_linux/article/details/71600574