vector
使用vector,首先需要添加vector头文件,即#include<vector>,
同时,必须要有“using namespace std;”。
-
vector的定义
定义一个vector的方法如下:
vector<typename> name;
相当于定义了一个一维数组name[size],只是size不确定,其长度可以根据需要而变化。其中,typename可以是任何基本类型,如int、double、char、结构体等,也可以是STL标准容器,如queue、vector 等。例如:
vector<int>a;
vector<double>score;
vector<node>stu;//node为已经定义了的结构体
如何用vector定义一个二维数组
vector<int> v[1001];//定义一个一维长度已经固定为1001的二维数组,另外一维长度不固定
vector<vector<int> >a;//定义一个两个维度长度都可变的二维数组
注意:如果typename也是一个STL容器,那么在定义时需要在两个“>”的符号之间加上一个空格,因为“>>”在C++11标准之前的编译器里会作为位移操作,从而导致编译错误。 -
vector的访问
访问vector中的元素一般有两种方式。
1) 通过“下标”访问。例如,对于容器vector[HTML_REMOVED]v,可以使用v[i]来访问它的第i个元素。其中,0<=i<=v.size()-1,v.size()表示vector中元素的个数。
2)通过“迭代器”访问。可以将迭代器(iterator)理解为一个类似指针的变量。其定义为:
vector<typename>::iterator it;
这样,it就是一个vector[HTML_REMOVED]::iterator型的变量。例如:
vector<int>::iterator it;
就是定义一个迭代器it,并且可以通过“*it”;来访问int类型的vector里的元素。例如:
vector<int>::iterator it=v.begin();//v.begin()为取v的首元素地址,而it指向这个地址,相当于v[0]。v[i]和*(v.begin()+i)是等价的。
for(int i=0;i<=5;i++)
printf("%d",*(it+i));//输出v[i]
在常用的STL容器中,只有vector和string允许使用“v.begin()+3”这种迭代器加上整数的写法。同时,迭代器也可以进行自加、自减操作,即it、it、it–、–it。例如:
for(vector<int>::iterator it=v.begin();it!=v.end();it++)
printf("%d",*it);//输出v[i]
- vector的常用函数
已提到过begin()和end()。这是一种“左闭右开”的表示方法。
1)push_back()
push_back(x)用来在vector后面添加一个元素x,时间复杂度为0(1)。
2)size()
如果是一维数组,size()用来获得vector中元素的个数;如果是二维数组,size()用来获得vector中第二维的元素个数,时间复杂度为0(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<5;i++)
printf("%d",v[i]);
3)pop_back()
pop_back()用来删除vector的尾元素,时间复杂度为0(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()
clear()用来清空vector中的所有元素,时间复杂度为0(n),其中n为vector中元素的个数。例如,以下代码输出“0”。
vector<int>v;
for(int i=1;i<=3;i++)
v.push-back(i);
v.clear();
printf("%d",v.size());
5)insert()
insert(it,x)用来向vector任意迭代器it处插入一个元素想,时间复杂度为0(n)。例如,以下代码输出“1 2 -1 3 4 5”。
vector<int>v;
for(int i=1;i<=5;i++)
v.push_back(i);
v.insert(v.begin()+2,-1);
for(int i=0;i<v.size();i++)
printf("%d ",v[i]);
6)erase()
erase()用来删除vector中的元素,有两种用法。一是erase(it),删除迭代器it处的元素;另一种是erase(first,last),删除左闭右开区间[first,last)内的所有元素。例如,以下代码输出“1 5”。
vector<int>v;
for(int i=1;i<=5;i++)
v.push_back(i);
v.erase(v.begin()+1,v.begin()+4);//删除v[1]、v[2]、v[3]
for(int i=0;i<v.size();i++)
printf("%d",v[i]);
其实上面的内容在《信息学奥赛课课通》中都有,身为一个蒟蒻目前还在看比较浅显的内容QAQ,但自己打一遍印象就会非常深刻,平常也可以当作电子文件看看。
vector<vector<int>> res
这里好像不要空格,也能编译通过在C++11标准之前的编译器里会被认为是右移,之后的就不知道了😂😂😂
多多总结点,例子程序,结果很棒,我基础都还不是很懂%%%