头文件 <vector>
vector是一个动态数组,默认的内存模型是C++标准库提供的allocator
vector的能力
vector将元素复制到内部的动态数组中,元素之间总是存在一定的顺序,所以vector是一种有序集合.
vector支持随机访问,可以在常量时间内访问任何一个元素,vector提供随机访问迭代器,适用于任何STL算法
如果你在末尾附加元素或删除元素 vector的效率就会非常好,
但如果你在前面或者中间部分插入元素,效率就比较差,作用点之后的每一个元素都必须移动到另一位置
其主要的成员变量是三个指针:如下
大小和容量
这个end就是实际分配内存的末尾
一旦超过了capacity,vector要重新分配内部内存
这个函数只有当新的容量大于当前vector的实际能够容纳的元素量,以及小于max_size()才会进行重新分配内存
vector的容量非常重要,有两个原因:
1.一旦内存重新分配,vector相关的所有引用指针迭代器都会失效
2.内存重新分配很耗时间
解决办法:
使用reserve()保留适当容量:
vector<int>v;
v.reserve(80);
初始化期间就向构造函数传递额外实参,构建足够的空间:
如果你的实参是个数组,它将成为vector的起始大小
std::vector<T>v(5);
想要获得这个能力,元素类型必须提供一个默认构造函数,对基础类型而言,唯一能够保证的是0初始化.
如果类型很复杂,就算提供了默认构造函数,初始化动作也是非常耗时,还不如使用reserve().
注意:从上面reserve的函数实现可以看出,vector不能使用reserve缩减容量
而且事实上为了防止内存破碎,在许多实现方案中即使你不调用reserve()第一次安插元素也会一口气分配整块内存
如果你有一大堆vector,每个vector的元素寥寥无几,浪费的内存相当可观
C++11引入了一个新的函数shrink_to_fit
:
可以看到如果有没有使用的容量,
如果当前容器是空的,则直接清除,如果不是为空的 缩减重新分配内存到当前的容量.
在C++11之前,还有一种办法,使用swap:
template<typename T>
void shrinkCapacity(vector<T