std::vector概述

        vector可以理解为动态数组,其特点和基本操作方式与array相似,但vector可以动态调整大小。

        vector中的元素是连续存储的,这意味着我们不仅可以通过迭代器std::vector<T>::iterator,还可以像array一样使用下标来访问任意位置的元素。

vector支持的基本操作:点击打开链接

vector的元素存储机制

        我们可以考虑一下,vector中的元素是连续存储的,且vector的大小是可变的,那么如果向vector中添加元素会发生什么:如果没有空间容纳新元素,容器不可能简单地将它添加到内存中其他位置——因为元素必须连续存储。容器必须分配新的内存空间来保存已有元素和新元素,将已有元素从旧位置移到新空间中,然后添加新元素,释放旧存储空间。如果我们每添加一个新元素,vector就执行一次这样的内存分配和释放操作,就会严重影响性能。
        事实上,vector对象采用自动预分配存储空间的方式来减少存储空间重新分配的次数以提高性能。因此存储相同元素的vector往往比array要占用更多空间,因为vector预分配更多的内存来处理未来的容量增长。这种分配策略显然比每次添加新元素时都重新分配容器内存空间的策略要高效得多。虽然vector在每次重新分配内存空间时都要移动所有元素到新位置,但使用此策略后,其扩张操作通常比list和deque还要快。

        同时,vector还为我们提供了一些成员函数来有限地参与vector的内存分配活动:


        上述操作中,reserve并不改变容器中元素的数量,它仅影响vector预先分配多大的内存空间。并且只有当需要的容量超过当前容量时,调用reserve才会改变vector的容量。如果需求大小大于当前容量,reserve至少分配与需求一样大的内存空间(可能更大)。如果需求大小不大于当前容量,reserve什么也不做。特别是当需求大小小于当前容量时,容器不会退回内存空间,即在调用reserve后capacity将会大于或等于传递给reserve的参数。这样,调用reserve永远也不会减少容器所占的空间。
成员函数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(中文版)第五版》


版权声明:本文为qq_37653144原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。