vector可以理解为动态数组,其特点和基本操作方式与array相似,但vector可以动态调整大小。
事实上,vector对象采用自动预分配存储空间的方式来减少存储空间重新分配的次数以提高性能。因此存储相同元素的vector往往比array要占用更多空间,因为vector预分配更多的内存来处理未来的容量增长。这种分配策略显然比每次添加新元素时都重新分配容器内存空间的策略要高效得多。虽然vector在每次重新分配内存空间时都要移动所有元素到新位置,但使用此策略后,其扩张操作通常比list和deque还要快。
成员函数shrink_to_fit()从C++11开始引入,调用它可以退回不需要的内存空间,但并不保证一定退回内存空间。
vector中的元素是连续存储的,这意味着我们不仅可以通过迭代器std::vector<T>::iterator,还可以像array一样使用下标来访问任意位置的元素。
vector支持的基本操作:点击打开链接
vector的元素存储机制
我们可以考虑一下,vector中的元素是连续存储的,且vector的大小是可变的,那么如果向vector中添加元素会发生什么:如果没有空间容纳新元素,容器不可能简单地将它添加到内存中其他位置——因为元素必须连续存储。容器必须分配新的内存空间来保存已有元素和新元素,将已有元素从旧位置移到新空间中,然后添加新元素,释放旧存储空间。如果我们每添加一个新元素,vector就执行一次这样的内存分配和释放操作,就会严重影响性能。事实上,vector对象采用自动预分配存储空间的方式来减少存储空间重新分配的次数以提高性能。因此存储相同元素的vector往往比array要占用更多空间,因为vector预分配更多的内存来处理未来的容量增长。这种分配策略显然比每次添加新元素时都重新分配容器内存空间的策略要高效得多。虽然vector在每次重新分配内存空间时都要移动所有元素到新位置,但使用此策略后,其扩张操作通常比list和deque还要快。
同时,vector还为我们提供了一些成员函数来有限地参与vector的内存分配活动:
成员函数shrink_to_fit()从C++11开始引入,调用它可以退回不需要的内存空间,但并不保证一定退回内存空间。
#include <iostream>
#include <vector>
int main()
{
std::vector<int> ivec;
for (int i = 0; i < 5; ++i)
ivec.push_back(i);
std::cout << "当前ivec中有" << ivec.size() << "个元素\t" << "当前最多能存储" << ivec.capacity() << "个元素" << std::endl;
ivec.shrink_to_fit();
std::cout << "调用shrink_to_fit()函数后的capacity为:" << ivec.capacity() << std::endl;
ivec.reserve(3);//reserve无法缩小vector的容量
std::cout << ivec.capacity() << std::endl;
ivec.reserve(10);
std::cout << ivec.capacity() << std::endl;
return 0;
}
本文部分内容摘自《C++ Primer(中文版)第五版》