不定长数组–vector
概念:
v e c t o r vector vector直译为“向量”,一般说成“变长数组”,也就是长度根据需要而自动改变的数组,有些题目需要开很多数组,往往造成内存超限,使用 v e c t o r vector vector简单方便,还可节省空间,使用 v e c t o r vector vector,必须加#include<vector>
及using namespace std;
。
定义:
vector<typename> name;
其中typename
为数据类型,name
为定义的不定长数组的数组名
eg.vector<int> v;
表示定义了一个数据类型为int,名为v的不定长数组
其中typename
也可以是一个STL容器
vector<vector<int> > a; //定义了一个两个维度都可变的二维整型数组a
注意vector<vector<int > > 这里两个>之间一定要加空格,不然编译器会误认为是位运算的左移符号“>>”
访问
访问vector中的元素一般有两种方式:下标访问 和 迭代器(iterator)访问
下标访问
对于容器vector<int> v,可以使用v[index]来访问它的第index个元素。其中,0≤index≤v.size() – 1,v.size()表示vector中元素的个数。
迭代器访问
可以将迭代器理解为一种类似指针的变量,使用前需要提前定义,其定义为:vector<typename>::iterator it,这个it就是一个迭代器,可以通过“*it”来访问该容器里的元素值:
vector<int>::iterator it = v.begin(); //定义一个迭代器it,初始化为容器v的首元素地址
*it//相当于v[0];
*(it + i)//相当于v[i]。
迭代器还可以进行自加自减操作,如it++,++it,it–,--it
,注意:迭代器不支持“it<v.end()
”的写法,只能是“it != v.end()
”, v.end()并不是取v容器尾元素地址,而是尾元素下一个地址。
for(vector<int>::iterator it=v.begin();it!=v.end();it++){
printf("%d",*it);
}
常用函数
1.push_back()
push_back(x)将x添加到容器最后,并相应让长度+1,时间复杂度为 O ( 1 ) O(1) O(1)。
2.size()
size()用来获得vector中元素个数,时间复杂度为O(1),同时,还可以使用resize(n)重设数组大小。例如以下代码输出12300:
vector<int> v;
for(int i=1;i<=3;i++){
v.push_back(i);
}
v.resize(5);
for(int i=0;i<v.size();i ++){
printf("%d",v[i]);
}
3.pop_back()
用来删除vector中的尾元素,并相应让长度-1。时间复杂度为O(1),例如以下代码输出12:
vector<int> v;
for(int i=1;i<=3;i ++){
v.push_back(i);
}
v.pop_back();
for(int i=0;i<v.size();i++){
printf("%d",v[i]);
}
4.clear()
用来清空vector中的所有元素。时间复杂度为O(n),例如以下代码输出0:
vector<int> v;
for(int i=1