vector 向量,使用“变长数组”更容易理解,即“长度根据需要自动改变的数组”。
1、定义
vector<typename> name;
上面的定义就相当于定义了一维数组name[size],只是其长度可以根据需要而变化。这里的typename可以是任何基本类型,例如int,double,char,结构体等,也可以是STL标准容器,例如vector、set、queue等。注意如果typename也是一个STL容器,定义的时候要记得在>>符号之间加入空格,因为一些使用C++11之前标准的编辑器会把它视为移位操作,导致编译错误。
例如:
vector<int> name;
vector<double> name;
vector<char> name;
vector<vector<int> > name;
定义vector数组的方法:
vector<typename> Arrayname[arraySize];
例如: vector<int> vi[100];
与vector<vector<int> >name 不同的是,这种写法的一维长度已经固定为arraySize,另一维才是“变长”的
2、vector容器内元素的访问
两种访问方式:通过下标访问或者通过迭代器访问
2.1 通过下标访问
直接访问vi[index]即可,例如(vi[0],vi[1]);
2.2 通过迭代器访问
迭代器(iterator)可以理解为一种类似指针的东西,其定义是:
vector<typename>::iterator it;
例如:
vector<int>::iterator it;
这样就得到了迭代器it,并且可以通过*it来访问vector里面的元素
例如:
vector<int> vi;
for(int i=0;i<=5;i++)
vi.push_back(i);
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++){
vi.push_back(i);
}
//vi.begin()为取vi的首元素地址,而it指向这个地址
vector<int>::iterator it = vi.begin();
for(int i=0;i<5;i++){
printf("%d ",*(it+i));
return 0;
}
输出结果:
1 2 3 4 5
从中可以看出vi[i]和*(vi.begin()+i)是等价的
虽然vi.begin()是取vi的首元素的地址,但是end()函数并不是取vi的尾元素的地址,而是取尾元素地址的下一个地址。end()作为迭代器末尾的标志,不存储任何元素。
除此之外,迭代器还实现了两种自加操作:++it 和 it++
例如:
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++)
vi.push_back(i);
//vector的迭代器不支持it< vi.end()写法,因此循环条件只能用it !=vi.end()
for(vector<int>::iterator it=vi.begin();it!=vi.end();it++)
printf("%d ",*it);
return 0;
}
输出结果:
1 2 3 4 5
注意:在常见STL容器中,只有vector和string中,才允许使用vi.begin()+3这种迭代器加上整数的写法
3、vector常用函数实例解析
3.1 push_back()
在vector后面添加一个元素x,时间复杂度O(1)
3.2 pop_back()
删除vector的尾元素,时间复杂度为O(1)
3.3 size()
获得vector中的元素,时间复杂度为O(1)
3.4 clear()
清空vector中所有元素,时间复杂度为O(n)
3.5 insert()
insert(it,x)用来向vector的任意迭代器it处插入一个元素x,时间复杂度为O(n)
例如:
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
vector<int> v1;
for(int i=1;i<=5;i++)
v1.push_back(i);
v1.insert(v1.begin()+2,-1);
for(int i=0;i<v1.size();i++)
printf("%d ",v1[i]);
return 0;
}
输出结果:
1 2 -1 3 4 5
3.6 erase()
erase()有两种用法:删除单个元素、删除一个区间内的所有元素
3.6.1 删除单个元素
erase(it)即删除迭代器为it处的元素
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
vector<int> v1;
for(int i=5;i<=9;i++)
v1.push_back(i);
v1.erase(v1.begin()+3);
for(int i=0;i<v1.size();i++)
printf("%d ",v1[i]);
printf("\n");
return 0;
}
输出结果:
5 6 7 9
3.6.2 erase(firsr,last) 删除 [first, last)内的所有元素
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=5;i<=9;i++)
vi.push_back(i);
vi.erase(vi.begin()+1,vi.begin()+4); //删除vi[1],vi[2],vi[3]
for(int i=0;i<vi.size();i++)
printf("%d ",vi[i]);
printf("\n");
return 0;
}
输出结果:
5 9