1.变长数组vector
概念
vector译为向量,一般来说也叫变长数组,也就是长度可以任意变化的数组,有些题目需要开很多数组,往往造成内存超限,使用vector简单方便,还可节省空间。
头文件
头文件,需要用using namespace std;。
定义方式
vector<type_name> name;
其中type_name可以是任何数据类型,如int,double,char,string,结构体,vector等
例:
vector<int> a; //定义了一个整型不定长数组a
vector<double> score; //定义了一个双精度浮点型不定长数组score
vector<node> stu; //定义了一个结构体类型的不定长数组stu
注意事项
如果type_name也是一个STL的容器,那么定义时需要在两个“>”符号之间加一个空格,不然编译器会误认为是位运算的右移符号“<<”,例如:
vector<vector<int> > a; //定义了一个两个维度都可变的二维整型数组a,两个“>”间有一个空格
vector的访问
访问vector中的元素一般有两种方式:下标访问 和 **迭代器(iterator)**访问。
下标访问:对于vector<type_name> vec,可以用vec[index]来访问,其中,0≤index≤vec.size() – 1,vec.size()表示vector中元素的个数。
迭代器访问:对于vector<type_name> vec,可以设一个vector<type_name>::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);
常用函数
push_back()
解释:push_back(x)将x添加到容器最后,时间复杂度为O(1)。
size()
解释:如果是一维数组,size()用来获得vector中元素个数;如果是二维数组,size()用来获得vector中第二维的元素个数,时间复杂度为O(1)。
pop_back()
解释:用来删除vector中的尾元素。时间复杂度为O(1)
clear()
解释:用来清空vector中的所有元素。时间复杂度为O(n)
insert()
解释:insert(it, x)用来向vector任意迭代器it处插入元素x。时间复杂度为O(n)。
例:
vector<int> v;
for(int i = 1;i <= 5;i ++)
v.push_back(i)
vector<int>::iterator it = v.begin();
v.insert(it + 2,-1);
for(;it != v.end();it ++)
printf("%d ",*it);
//以上代码会输出1,2,-1,3,4,5
erase()
解释:erase()用来删除vector中的元素,有两种用法,一是erase(it),删除迭代器it处的单个元素;二是erase(first, last),删除左开右闭区间[first, last)内的所有元素。
例如:
vector<int> v;
for(int i = 1;i <= 5;i ++)
v.push_back(i);
vector<int>::iterator it = v.begin();
v.erase(it + 1);
v.erase(it + 2,it + 4);
for(int i = 0;i < v.size();i ++)
printf("%d",v[i]);
//以上代码会输出1,3