标准库 vector 类型
vector 是同一种类型的对象的集合, 我们把vector 称为容器,是因为它可以包含其他对象。 一个容器中的所有对象都必须是同一种类型。vector 是一个类模板 (class template)。
vector<int> ivec;
vector<Sales_item> Sales_vec;
和其他变量定义一样,定义vector 对象要指定类型和一个变量的列表。上面的第一个定义,类型是vector<int>,该类型即是含有若干int 类型对象的vector, 变量名是 ivec。第二个定义的变量名是Sales_vec, 它所保存的元素是 Sales_item 类型的对象。
注:vector 不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。 vector 类型是每一种都指定了其保存元素的类型。 因此, vector<int> 和 vector<string> 都 是数据类型。
//几种初始化vector对象的方式
vector<T> v1; //vector保存类型为T的对象。默认构造函数v1为空
vector<T> v2(v1); //v2是v1的一个副本
vector<T> v3(n, i); //v3包含n个值为 i 的元素
vector<T> v4(n); //v4含有值初始化的元素的n 个副本
关键概念:vector 对象动态增长 。
vector 对象(以及其他标准库存容器对象)的重要属性就在于可以在运行时高效地添加元素。因为vector 增长的效率高,在元素值已知的情况下,最好是动态地添加元素。
vector 对象的操作
v.empty() //如果v为空,则返回true,否则返回false
v.size() //返回v中元素中个数
v.push_back(t) //在v的末尾增加的一个值为t的元素
v[n] //返回v中位置为n的元素
v1= v2; //把v1的元素替换为v2中元素的副本
v1 == v2; //如果v1与v2相等,则返回true
!= , < , <= , > , >= //保持这些操作符惯有的含义
empty 和 size 操作类似于 string 类型的相关操作。 成员函数 size 返回相应vector 类定义的 size_type 的值。
使用 size_type 类型时, 必须指出该类型是在哪里定义的。 vector 类型总是包括vector 的元素类型;
vector<int>::size_type // ok
vector::size_type // error
注:下标写法是不可以添加元素,如以下程序
vector<int> ivec; //empty vector
for (vector<int>::size_type ix=0; ix != 10; ++ix)
ivec[ix] = ix; //disaster: ivec has no elements
上述程序试图在ivec中插入10个元素,元素值依次为0到9的整数。但是,这里ivec是空的vectorc对象 ,而且下标只能用于获取已存在的元素。
这个循环的正确写法应该是:
for(vector<int>::size_type ix = 0; ix != 10; ++ix)
ivec.push_back(ix); //ok: adds new element with value ix
必须是已存在的元素才能用下标操作符进行索引。通过下标操作进行赋值时,不会添加任何元素。
警告:对于下标操作符([ ]操作符)的使用有一点非常重要,就是仅能提取确实已存在的元素。试图获取不存在的元素必然产生运行时错误。所谓“缓冲区溢出”错误就是对不存在的元素进行下标操作的结果。这样的缺陷往往导致PC机和其他应用中最常见的安全问题。