vector,向量,有序数列。连续的空间存储,可以使用[ ]操作符,可以快速的访问随机的元素,快速的在末尾插入元素,但是在序列中间随机的插入、删除元素要慢。如果空间不够时,有一个重新分配更大空间的过程。
入门使用
#include<vector>
vector<int> vec = {1,2,3};//11标准支持
vec.push_back(4);
vec.push_back(5);
for(int i=0;i<vec.size();++i)
cout<<vec[i];
常用方法一览
vec.push_back(x);//在数组的最后添加一个元素 x 。
vec.pop_back();//无参,去掉数组的最后一个数据。
vec.begin();//无参,返回数组头的迭代器。
vec.end();//无参,返回数组的最后一个单元+1的迭代器。
vec.clear();//无参,清空当前的vector。
vec.empty();//无参,判断vector是否为空。
vec.size();//无参,返回当前使用数据的大小。
vec.capacity;//无参,返回当前vector分配的大小。
vec.max_size();//无参,返回vector最大可以是多大。
vec.at(p);//返回数字 p 位置的数据。比 [ ] 操作符安全,有超出范围检查,超出范围可以抛异常。
int a = vec.front();//无参,返回数组头的引用。对 a 的修改不会影响vector的内容。
int &a = vec.front();//无参,返回数组头的引用。对 a 的修改同时会改变vector对应的元素^1^。
int b = vec.back();//无参,返回数组的最后单元的引用。同front()。
vec.erase(iterator position);//删除迭代器指向的元素,容器大小改变,已有迭代器可能实效。
vec.erase(iterator first,iterator last);//删除[first,last)中元素。
vec.swap(vec2);//与另一个vector交换数据。
进阶使用
以vector
创建与初始化
vector<int> vec;//创建一个空vector。
vector<int> vec = {1,2,3};//列表初始化为{1,2,3}。对于vector<int>类型的函数可以直接用{1,2,3}。
vector<int> vec(int n);//创建一个大小为 n 的vector。
vector<int> vec(int n,int t);//创建vector,元素个数为n,值均为t。
vector<int> vec(vector&);//复制另一个vector。
vector<int> vec(begin,end);//复制[begin,end)区间内另一个数组的元素到vector中。begin、end都是迭代器。尚且不明确能从哪些容器中进行复制。
vector<vector<int>> vecdi;//二维数组。操作时注意行是否存在,再对行中元素进行操作。
vector<vector<int>> vecdi = {{1,2,3},{4,5,6},{7,8,9}};//序列初始化。
vector<vector<int>> vecdi(3,vector<int>(9));//3行9列,全为0。
添加
vec.push_back(x);//末尾添加元素x。
vec.insert(iter,x);//迭代器iter指向元素前增加一个元素 x 。
vec.insert(iter,n,x);//迭代器指向元素前增加 n 个相同元素 x 。
vec.insert(iter,iter_first,iter_first);//迭代器指向元素前插入另一个相同类型向量的[iter_first,iter_first)间的数据。
vecdi.push_back({});//二维数组添加一个空行。
vecdi.push_back(vector<int>());//同上。
遍历
for(int i=0;i<vec.size();++i) cout<<vec[i];
// 迭代器遍历,迭代器看作指针使用。
for(vector<int>::iterator iter = vec.begin();iter!=vec.end();++iter)
vec2.push_back(*iter);
// auto代替迭代器,C++11标准。
for(auto iter = vec.begin();iter!=vec.end();++iter)
vec2.push_back(*iter);
拷贝vector
vector<int> vec2(vec);//初始化时拷贝。
vec.assign(vec2.begin(),vec2.end());//利用assign函数拷贝。
vec.assign(n,x);//将vector替换成 n 个元素 x ,之前内容清除。
vec.insert(vec.end(),vec2.begin(),vec2.end());//用insert()函数向vec末尾提添加vec2。
vec.swap(vec2);//交换两个vector。
swap(vec[2],vec[5]);//将vec中的两个元素互换。
assign()函数:string与vector
assign()是
#include<string>
string str = "hello world";
vector<char> vec(str.begin(),str.end());//vec={'h','e','l','l','o',' ','w','o','r','l','d'}
string strc;
strc.assign(vec.begin(),vec.end());//strc="hello world"
string strcopy(vec.begin(),vec.end()-5);//strcopy = "holle "
vec.assign(strcopy.begin(),strcopy.end());//vec={'h','e','l','l','o',' '}
删除
vector<int> vec = {1,2,3,4,5}
cout<<*(vec.end()-1);//结果是最后的5。
vec.pop_back();//删除5。
cout<<*(vec.end());//这里不-1,会惊奇地发现此结果竟然是5!
练习
关于vector的使用可以用这些力扣题作为进阶练习:
| 加一 |有效的数独 | 旋转图像 |
[^2]: 参考baike.baidu.com/item/assign()/9716433?fr=aladdin