什么是向量容器
向量容器是一种支持高效的随机访问和高效的尾部插入新元素的容器。
向量容器一般实现为一个动态分配的数组,向量中的元素连续的存放在这个数组中,因此对向量容器进行随机访问具有和动态访问动态数组一样的效率。
内部如何工作
在使用动态数组时,必须用new
分配空间时指定数组的大小,并且不能在使用过程中将其空间动态扩展。为了实现向量的动态插入,当数组空间不够时,向量容器对象会自动用new
分配一个更大的空间,使用=
赋值号将原有的数据分别复制到新的空间中,并将原有空间释放。
但是,如果每一次进行尾插入是都要进行以上操作肯定是我们无法接受的。所以,每次向量容器扩展空间时,实际上分配的空间一般都会大于所需要的空间。另外,将已有元素从向量容器中删除时,多出的闲置空间并不会被释放,因为后面可能会进行元素插入而是用该空间。
因此,向量容器对象已分配的空间能容纳的实际元素个数一般都大于实际存放的元素个数。前者叫做容量capacity
,后者叫做大小size
。
注意事项
向量容器中插入新元素时,插入位置后面的元素都要顺序后移,因此向量容器插曲元素位置越靠前其效率越低,在向量尾部插入元素的效率是比较高的。
如果在插入元素时引起了向量容量的扩展,那么在执行插入操作之前所获得的一切迭代器和指向向量元素的指针、引用都将失效,因为内存地址发生改变。如果未引起空间扩展,那么只有在插入元素位置之后的地址会发生变化,也就是说引起后面的一些指针引用等失效。
定义和初始化方法
vector<int>v1; // 默认构造函数,v1为空
vector<int>v2(v1); // v2是v1的一个副本,v2就是对v1的复制粘贴,地址不同
vector<int>v3(n,i); // v3包含n个值为i的元
vector<int>v4(n); // v4包含n个值为0的元素
向量容器的一些方法
v.push_back(e); // 再数组最后添加一个值为e的数据,追加
v.erase(v.begin()+1); // 删除指定元素,参数是被删除元素的地址,例子中删除的时第二个元素
v.pop_back(); // 移除数组最后一个元素
v.clear(); // 清空所有元素
len = v.size(); // 返回数组的元素个数,大小
emp = v.empty(); // 判断数组是否为空,true/false
v.capacity(); // 返回v的容量
v.reserve(n); // 当容量大于n时,什么也不做,反之扩大v的容量,使之不小于n
参考书
《C++语言程序设计(第四版)》 清华大学出版社