目录
前言
C++ STL是一个非常强大的容器库,其中动态数组vector是最方便的容器之一。接下来介绍vector的一些基本操作,其主要操作依然是“增 删 改 查”:
一、vector的声明(初始化)
vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,本文中以存储整形为例。
对vector的初始化有以下几种常用方式,只需熟练掌握红色标注即可:
(1)vector <int> ver = vector<int>();或 vector <int> ver;//此时定义的ver所占空间不确定,可动态添加新空间
(2) vector<int> ver(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。
(3)vector<int> ver(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1
(4)vector<int> ver(b); //用b向量来创建ver向量,整体复制性赋值
(5)vector<int> ver(b.begin(),b.begin()+3); //定义了ver值为b中第0个到第2个(共3个)元素
(6)int b[7]={1,2,3,4,5,9,8}; vector<int> ver(b,b+7); //从数组中获得初值
(7)vector<vector<int>> ver; //二维向量
二、增:添加元素
int t;
cin>>t;
ver.push_back(t);//将t添加到vector数组末端
ver.insert(ver.begin()+n, t);//将t插入到ver.begin()+n 这里参数不可以写int型,应写指针!!
注意:若用cin>>输入数据或者用下标方式ver[i]=t赋值,那vector必须有空间,可以用resize()赋空间或者直接用push_back(t)添加元素即可。
也可以初始化时用vector <int> ver(n);这样就可以cin>>输入数据或者用下标方式ver[i]=t赋值,但是这样就不可以用push_back(t)添加数据,因为push_back(t)是向末尾添加数据!!!而前n个默认为0,push_back(t)并不会修改前n个的值。
三、删:删除元素
ver.erase(iterator p);//删除迭代器p指向的位置的元素
ver.erase(ver.begin()+1,ver.begin()+3); //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+ 3(不包括它)
ver.pop_back();//删除最后一个元素
ver.pop_front();//删除第一个元素
四、改:修改元素
待补充ing……详情看总结部分
五、查:遍历元素
//遍历元素可以有两种方法:
//1.下标遍历
for (int i = 0; i < n; i++)
cout << ver[i] << " ";
//2.迭代器遍历vector <int>::iterator p;
for(auto p=ver.begin();p!=ver.end();p++)
cout << *p << " ";
其中 auto代表 vector <int>::iterator(迭代器类型)
注意:*(p+1)== *(ver.begin()+1) == ver[i+1]
总结
vector还包含着各种功能的函数,总结如下(部分):
push_back() //在数组的最后添加一个数据
pop_back() //去掉数组的最后一个数据at() //得到编号位置的数据
begin() //得到数组头的指针
end() //得到数组的最后一个单元+1的指针
front() //得到数组头的引用
back() //得到数组的最后一个单元的引用
max_size() //得到vector最大可以是多大
capacity() //当前vector分配的大小
size() //当前使用数据的大小
capacity(); //返回a在内存中总共可以容纳的元素个数
a.reserve(100); //改变当前vecotr所分配空间的大小将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100
a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,增加的元素其值默认为0
a.resize(10,2); //将a的现有元素个数调至10个,多则删,少则补,增加的元素其值为2
erase() //删除指针指向的数据项
clear() //清空当前的vector
rbegin() //将vector反转后的开始指针返回(其实就是原来的end-1)
rend() //将vector反转构的结束指针返回(其实就是原来的begin-1)
empty() //判断vector是否为空
swap() //与另一个vector交换数据
a.swap(b); //b为向量,将a中的元素和b中的元素进行整体性交换reverse(obj.begin(),obj.end());反向迭代器,实现元素对调
auto it = find(nums.begin(), nums.end(), target)//返回的是target第一次出现的地址it,如果没有找到返回尾地址nums.end() 使用时需要algorithm头文件。int index = distance(nums.begin(),it);//返回it距离数组第一个元素的距离,即it所指元素下表。
sort(a.begin(),a.end(),cmp); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列 cmp可自定义,也可以没有(没有的话默认从小到大)
copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素。