vector
是标准库类型,表示对象的集合,其中所有对象的类型都相同。集合中每个对象都有一个索引,用于访问对象。
头文件:<vector>
命名空间:std::vector
vector
是一个类模板,模板本身不是类或函数,可以看作编译器生成类或函数的一份说明。编译器根据模板创建类或函数过程叫做实例化。
1. vector
实例化
vector<int> vec; //保存int类型的对象
vector<vector<int>> veci; //c++11 该向量元素是int的向量对象
注意:vector能容纳大多数类型的对象作为元素,但是引用因为不是对象,所以不能作为元素。
1.1 元素为vector
类型
若组成vector
的类型也是vector
,在早期版本标准中其定义的形式和现在c++11不同,过去必须在外围vector
对象的右尖括号和元素类型之间加一个空格。
vector<vector<int>> veci; //c++11 该向量元素是int的向量对象
vector<vector<int> > veci; // 旧版本 该向量元素是int的向量对象
2. 定义和初始化vector对象
vector <T> v1; //v1是一个空vector,执行默认处初始化
vector<T> v2(v1); //v2包含v1所有元素
vector<T> v2=v1; //与上个等价
vector<T> v3(n,val); //包含n个值为val的重复元素。
vector<T> v4(n); //包含n个执行默认初始化的对象
vector<T> v5{a,b,c...} //包含初始化值分别为a,b,c...的元素
vector<T> v5={a,b,c...} //与上个等价
注意:最常见的定义方式是先定义一个空vector
,然后当运行时添加元素。
2.1 列表初始化vector
对象(C++11)
C++11新标准提供一种vector
对象的元素赋初值的方法,列表初始化。
vector<string> astr={"a","bc","def" };
包含了三个元素,也就是目前astr的size大小为3。
注意:若定义时需要提供初始值,则:
使用拷贝初始化(使用=)则只能提供一个初始化值,若提供类内的初始化值,只能使用拷贝或花括号,不能使用小括号。
vector<string> astr="a";
vector<string> astr={"a","b"};
vector<string> astr=("a","b"); //错误
vector<string> astr("a","b");//错误
2.1.1列表初始化值还是初始化元素数量
- 如果用圆括号,则括号内值用来构造
vector
对象,若用花括号,则表示列表初始化值。
vector<int> v1(10);//v1又10个元素,值为0
vector<int> v2{10};//v2有一个元素,值为10
vector<int> v1(10,1);//v1有10个元素,值为1
vector<int> v2{10,1};//v2有2个元素,值为10和1
- 若花括号内值和
vector
元素类型不匹配,则尝试用来构造vector对象。
vector<string> v1{"he"}; //列表初始化,v1有一个元素,值为“he”
vector<string> v2("he"); //错误,不能使用圆括号初始化值
vector<string> v3{10}; //v3有10个元素,值都为空
vector<string> v4{10,"he"}; //v4有10个元素,值都为“he”
2.2 创建指定数量元素
vector<string> astr(10,"b");//创建10个string类型的元素,其值都是“b”
3. 向vector
中添加元素
vector<int> v2;
v2.push_back(2); //向v2末尾添加一个元素 ,其值为2.
注意:如果循环体内部包含向vector
对象添加元素的语句,则不能使用范围for
循环,因为此时vector
的大小是变化的。
不能用下标形式添加元素,下标必须对确知存在的元素使用下标。
为了防止越界,最好的方法就是使用范围for
语句循环。
其他vector操作
v.empty() //判断是否为空,是返回true
v.at(n);//访问位置n的元素
v.size(); //返回大小,返回值类型为无符号整数型
v.push_back(t); //插入元素t,大小增加1
v[n]; //返回v中n位置上元素的引用
v1=v2; //拷贝v2到v1
v1={a,b,c...} // 列表初始化值
v1==v2 //当所有元素都相等则真
v1!=v2 //顾名思义
<,>,<=,>= //顾名思义
其他操作查看官网资料
4. 数组与vector
int a[]={1,2,3,4,3,2,1,2,1};
vector<int> b(a,a+9);//将数组中0到9的元素拷贝到vector
vector<int> c=(&a[0],&a[8]); //结果和上个一样
5. 迭代器遍历
for(vector<int>::iterator t=a.begin();t!=a.end();t++) //定义一个vector<int>类型的迭代器,进行循环迭代
......