3.3 标准库vector类型
vector是同一种类型的对象的集合,每个对象都有一个对应的数据索引值。和string对象一样,标准库将负责管理与存储元素相关的内存。我们把vector称作容器,是因为它可以包含其他对象。一个容器中的所有对象都必须是同一种类型的。
vector是一个类模板(class template,也就是C#中的泛型)。使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型。
vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector类型的每一种都指定了其保存元素的类型。因此,vector<int>和vector<string>都是数据类型。
3.3.1 vector对象的定义和初始化
1. 创建确定个数的元素
vector对象的重要属性就在于可以在运行时高效地添加元素。因为vector增长的效率高,当元素已知时,最好是通过动态地向它添加元素来让它增长。
虽然可以对给定元素个数的vector对象预先分配内存,但更有效的方法是先初始化一个空的vector对象,然后动态地增加元素。
2. 值初始化
vector<string> vec(10, "null");
如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行值初始化。
第12章将介绍一些有自定义构造函数但没有默认构造函数的类,在初始化这种类型的vector对象时,程序员就不能仅提供元素个数,还需要提供元素初始值。
3.3.2 vector对象的操作
1. vector对象的size
成员函数size返回对应vector类定义的size_type的值。
vector<string> vec(10, "null");
vector<string>::size_type siz = 5;
cout << vec[siz] << endl;
2. 向vector添加元素
push_back()操作接受一个元素值,并将它作为一个新的元素添加到vector对象的后面,也就是“插入”到vector对象的“后面:。
vector<string> vec(10, "null");
vector<string>::size_type siz = 10;
vec.push_back("aaa");
cout << vec[siz] <<endl;
3. vector的下标操作
vector中的对象是没有命名的,可以按vector中对象的位置来访问它们。通常使用下标操作符来获取元素。
vector的下标操作符接受一个值,并返回vector中该对应位置的元素。
在for循环中,C++程序员习惯优先选用!=而不是<来编写循环判断条件。
4. 下标操作不添加元素
下标只能用于已存在的元素。
必须是已存在的元素才能用下标操作符进行索引。通过下标操作进行赋值时,不会添加任何元素。
对于下标操作符的使用有一点非常重要,就是仅能提取确实已存在的元素。
不幸的是,试图对不存在的元素进行下标操作是程序设计过程中经常会犯的严重错误。所谓的”缓冲区溢出“错误就是对不存在的元素进行下标操作的结果。这样的缺陷往往导致PC机和其他应用中最常见的安全问题。