标准库类型vector表示对象的集合,其中多有对象的类型都相同,集合中的每个对象都有一个与之对象的索引用来访问对象,需要注意的是引用不是对象,所以不存在包含引用的vector,因其用来容纳着其他对象,所以也被称为容器(container)。使用vector时需要包含适当的头文件:
#include
using std::vector;
C++语言有类模板(class template)和函数模板,vector是一个类模板,编译器根据模板创建类或函数的过程称为实例化(instantiation),使用模板时,需要指出编译器应把类或函数实例化成哪种类型。
一、定义和初始化vector对象
可以默认初始化vector对象,从而创建一个指定类型的空vector,也可在定义vector对象时指定元素的初始值,允许把一个vector对象的元素拷贝给另外一个vector对象,注意两个vector对象的类型必须相同。
vector<string> svec; //默认初始化,svec不含任何元素
vector<int> ivec1; //同上
//然后再给ivec1添加一些值
vector<int> ivec2(ivec1); //把ivec1的元素拷贝给ivec2
vector<string> svec(ivec2); //错误,两个vector对象类型不同
1.1 列表初始化vector对象
列表初始化即为用花括号括起来的0个或多个初始值被赋给vector对象:
vector<string> articles = {"a","an","the"};
1.2 创建指定数量的元素
可以用vector对象容纳的元素数量和所有元素的统一初始值来初始化vector对象:
vector<int> ivec(10,-1); //10个int类型元素,每个都初始化为-1
vector<string> svec(10,"hi!");
如果只提供vector对象容纳的元素数量而没有初始值,那么库会创建一个值初始化的元素初值,并赋给容器所有元素,即在vector中直接初始化的形式是创建含有若干个值初始化的元素的vector对象。
vector<int> ivec(10); //10个元素,每个都初始化为0
vector<string> svec(10); //10个元素,每个都是空string对象
可以通过花括号和圆括号,以及列表提供的值能不能用来列表初始化来判断列表是初始值还是元素数量,当列表提供的值不能作为元素的初始值,确认无法执行列表初始化后,编译器会尝试使用默认初始化vector对象,如下面的v7和v8。
vector<int> v1(10); //v1有10个元素,每个都是0
vector<int> v2{10}; //v2有1个值为10的元素
vector<int> v3(10,1); //v3有10个值都为1的元素
vector<int> v4{10,1}; //v4有两个值分别为10和1的元素
vector<string> v5{"hi"}; //列表初始化,v5有一个元素
vector<string> v6("hi"); //错误,不能使用字符串字面值构建vector对象
vector<string> v7(10); //v7有10个默认初始化的元素
vector<string> v8{10,"hi"}; //v8有10个值为“hi"的元素
二、向vector对象中添加元素
当不知道需要创建一个包含多少元素的vector对象时,可以先创建一个空vector,然后在使用vector的成员函数push_back向其中添加元素,push_back负责把一个值当成vector对象的尾元素压进vector对象的尾端,下面是一个例子,但需要注意的是循环体内部包含有想vector对象添加元素的语句,则不能使用范围for循环。
vector<int> v2; //创建空vector对象
for (int j = 0; j != 100; ++j)
v2.push_back(j); //依次把整数值放到v2尾端
三、其他vector操作
vector的其他操作大多数和string的相关操作类似,可以使用范围for语句处理vector对象中的所有元素:
vector<int> v{1,2,3,4,5};
for (auto &j : v) //对于v中的每个元素,j是一个引用
j *= j; //求元素值的平方
for (auto j : v)
cout << j << " "; //输出该元素
cout << endl;
vector的empty和size两个成员与string的同名成员功能完全一致,empty检查vector对象是否包含元素然后返回一个布尔值,sizeze返回vector对象中元素的个数,返回值的类型是由vector定义的size_type,需要注意vector对象的类型总是包含着元素的类型。
vector<int>::size_type //正确
vector::size_type //错误
另外需要注意不能通过vector对象的下标形式来添加元素,可以使用下标运算符来访问已存在的元素。
参考文献:
①C++ Primer 第五版。