一、概述
vector构造出一个动态数组,本身是将元素置于动态数组中加以管理的抽象概念。使用vector之前必须含入头文件<vector>,vector是一个定义于namespace std内的template
namespace std {
template <class T,
class Allocator = allocator<T> >
class vector;
}
vector将元素复制到内部动态数组中,vector的迭代器是随机存取迭代器,所以支持随机存取。在末端添加、删除元素时,vector的性能相当好。但是在前端或者中部安插或删除元素,性能就不怎么好了,因为操作点之后的每一个数据都要移动到另一个位置。vector性能优异的重要原因就是配置比其容纳元素所需更多的内存。vector的容量很重要:
1. 一旦内存重新配置,和vector相关的引用、指针、迭代器都会失效;
2. 内存重新配置很耗时间。
二、vector的内部结构
vector类内通过三个保护成员的迭代器变量维护内存空间的使用:
template <class T, class Alloc = alloc>
class vector {
//省略其他成员
protected:
iterator start; //表示目前使用空间的头
iterator finish; //表示目前使用空间的尾
iterator end_of_storage; //表示目前可用空间的尾
}
新增加元素时,如果超过当时容量,则容量会扩充至两倍。如果两倍容量仍然不够,就扩张至足够大的容量。所谓动态增加大小,并不是在原空间之后接续新空间(因为无法保证原空间之后有可用空间),而是以原大小的两倍另外配置一块较大的空间,然后将原空间内容拷贝过来,然后在原内容之后构造新元素,释放原空间。一旦引起空间重新配置,指向原空间的所有迭代器就失效了!
三、vector的操作函数
1. 构造、拷贝和析构
操作 | 效果 |
---|---|
vector<Elem> c | 产生一个存放Elem类型元素的空vector |
vector<Elem> c1(c2) | 产生一个与c2同型的vector,每个元素都被复制 |
vector<Elem> c(n) | 产生一个含有n个元素,以default构造函数产生元素的vector |
vector<Elem> c(n,elem) | 产生一个含有n个elem元素的vector |
vector<Elem> c(beg,end) | 产生一个以区间[beg,end]内元素为初值的vector |
c.~vector<Elem>() | 销毁所有元素,释放内存 |
2. 非变动性操作
操作 | 效果 |
---|---|
c.size() | 返回元素个数。 |
c.empty() | 判断容器大小是否为0。 |
c.max_size() | 返回整个内存空间可容纳元素最大数量 |
c.capacity() | 返回重新分配空间前容器所 |