Q1:vector是什么?
答:vector是一种容器,容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。vector(矢量),是一种变长数组,即自动改变数组长度的数组(数组在定义是就确定了长度,且不可更改而vector容器长度不固定,可以随时更改)
Q2:vector如何使用?
1.添加头文件
在使用vector的时候需要添加#include <vector>
才可以正常使用(这一步很重要!!)
2.vector的定义
vector<类型名> 变量名;
类型名可以是int、double、char、struct,也可以是STL容器:vector、set、queue
vector<int> name;
vector<double> name;
vector<char> name;
vector<struct node> name;
vector<vector<int> > name;//注意:> >之间要加空格
- vector数组就是一个一维数组
(如vector<int> name;
中name相当于一个存放整型变量的一维数组名) - 如果定义成vector数组的数组,那就是二维数组
(如vector<int> array[SZIE]; //二维变长数组
)
总结:低维是高维的地址(列如:二维数组中,它的一维形式就是地址)
3.vector的初始化
- 方法1(直接法)
vector<int> v1={
1,2,3,4,5};
此时v1就相当于含有5个元素的一维数组
注意:有的版本编译器不支持这样的初始化
- 方法2(数组指针法)
int a[5]={
1,2,3,4,5};//先定义一个数组
vector<int> v1(a,a+5);//注意末尾指针指向最后一个元素之后的位置
//下面为遍历vector容器,输出结果,检测初始化结果是否正确
for(int i=0;i<v1.size();i++) //v1.size()为获取容器的大小
cout<<v1[i]<<' ';
cout<<endl;
**结果:1 2 3 4 5
- 方法3(n个elem)
vector<int> v2(3,6);//将三个6赋值给v2
for(int i=0;i<v2.size();i++)
cout<<v2[i]<<' ';
cout<<endl;
**结果:6 6 6
- 方法4(拷贝法)
vector<int> v3(v1);//将vector容器v1作为参数传给v3,则v3容器中的数据和v1中相同
for(int i=0;i<v3.size();i++)
cout<<v3[i]<<' ';
cout<<endl;
**结果:1 2 3 4 5
注意:作为参数传入的v1只能是vector类型,不能是数组名
- 方法5:使用assign方法
//方法1(数组指针)
vector<int> v4,v5,v6,v7;
v4.assign(a,a+5);
for(int i=0;i<v4.size();i++)
cout<<v4[i]<<' ';
cout<<endl;
//方法2()
v5.assign(4,10);
for (int i = 0; i < v5.size(); ++i)
cout<<v5[i]<<' ';
cout<<endl;
//方法3(容器赋值容器)
v6.assign(v1.begin(),v1.end());
for (int i = 0; i < v6.size(); ++i)
cout<<v6[i]<<' ';
cout<<endl;
**结果:1 2 3 4 5
10 10 10 10
1 2 3 4 5
**补充:**取区间元素赋值
列如,有一个数vector容器v1v1={1,2,3,4,5}
我只想要将其中{2,3}
赋值给vector容器v2,那么我们便可以改变指针的指向来改变存储范围,如下所示:
v7.assign(v1.begin()+1,v1.end()-2);
for (int i = 0; i < v7.size(); ++i) {
cout<<v7[i]<<' ';
}
**结果:2 3
注意:end指针指向结束元素的下一个位置(比如这里的end指针指向元素4)
4.vector容器元素的输出
- 一种是通过下标索引的方式访问数据和数组类似,如有vector容器v1,如果想访问v1的第一个元素,则通过v1[0]访问,依次类推,以上代码都是下标索引方法
- 第二种使用
at()
访问,看实例:
vector<int> v1;
v1={
1,2,3,4,5};
for (int i = 0; i < v1.size(); ++i) {
cout<<v1.at(i)<<' ';
}
cout<<endl;
**结果:1 2 3 4 5
拓展:那么这两种访问方法有什么区别呢?
vector是一种动态数组,既然是数组那么便存在越界的可能,下面我们来看实例:
- 下标索引法遇到数组越界访问情况
vector<int> v1;
v1={
1,2,3,4,5};
cout<<v1[6]<<endl;
**结果:-1038988976
- at()法遇到数组越界访问情况
vector<int> v1;
v1={
1,2,3,4,5};
cout<<v1.at(6)<<endl;
**结果:terminate called after throwing an instance of 'std::out_of_range'
这里我们可以看到下标法遇到数组越界并不会报错,而是输出乱码,但是at()
方法便会报出错误的类型,所以at()
方法更有利于查找代码的错误