标准库类型vector表示对象的集合,其中对象的类型均相同,vector也被称作容器。使用vector,必须包含如下头文件和using声明:
#include <vector>
using std::vector;
vector是C++中的类模板,编译器需要根据类模板和我们提供的参数创建对应的类,这一过程称作实例化。
- C++中有类模板和函数模板
- 提供给类模板的额外信息格式入下:
类模板名<额外信息>
vector类模板需要提供的信息是vector中存放的对象的类型,如下
vector<int> ivec;
- 这句话中vector根据类模板生成了一个存放int对象的vector类型
- 然后定义了一个存放int对象的vector类型的对象ivec
- vector可以包含大多数类型作为其元素,但引用不是对象,因此vector不能包含引用
- vector可以包含vector
vector<vector<int>> //新版c++写法
vector<vector<int> > //老版c++要求右面的两个>>中间有一个空格
一、定义和初始化类型为T的vector
vector<T> v1; //初始化为空
vector<T> v2 = v1; //根据v1进行赋值初始化
vector<T> v2(v1); //根据v1进行直接初始化
vector<T> v3(n,val); //构造初始化,v3中有n个val
vector<T> v3(n) //构造初始化,v3中有n个T类型的默认值
vector<T> v4 = {a,b,c...}; //参数列表赋值初始化
vector<T> v4{a,b,v...}; //参数列表直接初始化
- 赋值初始化要求v1和v2类型必须完全相同,int和double不能相互赋值
- vector v3(n)要求类型T必须能够默认初始化,如果类型T要求显示初始化,则该构造语句错误
- 列表初始化必须使用{},构造初始化一般使用(),也可以使用{},但不推荐。当遇见{}时,优先考虑列表初始化,不符合列表初始化的才是构造初始化
二、vector操作
向vector中添加元素
使用push_back()函数向vector尾部添加新的元素
vector<int> a;
for(int i = 0; i != 100; i++)
a.push_back(i) //依次将0-99添加到vector中
- 在初始化vector时候,推荐初始化一个空的vector,然后利用push_back添加元素,这样做在C++中效率非常高
- 但是当vector中所有元素均相同的时候,列表或构造初始化效率更高
- 当循环体中有push_back()函数时候,不可以使用针对vector的范围for循环,因为范围for循环在遍历过程中不允许改变遍历对象的长度。但范围for循环在顺序遍历的时候可以有效保证不出现下标越界错误
- 在使用范围for循环对vector进行迭代时候,同样只有引用可以改变vector本身元素的值
- 禁止使用下标为vector添加新元素,下标只能访问已有元素,不能添加新元素,否则就是超出范围了
- 这里条件使用!=是C++泛型编程思想的体现,vector是一个容器,C++全部的容器都定义了和!=运算,但只有少部分定义了比较运算。同样string中最好也使用和!=
其他vector支持的操作
大多数与string支持的操作相同
- 当两个vector中类型能够比较的时候才可以比较
- vector.size()的类型是vector::size_type而不是vector::size_type,一般还是用decltype()来返回比较好