vector容器使用reserve预留空间

Posted mzct123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vector容器使用reserve预留空间相关的知识,希望对你有一定的参考价值。

vector容器reserve函数的作用:减少vector在动态扩展容量时的扩展次数;

//vector使用reserve预留空间,减少vector在动态扩展容量时的扩展次数
vector<T> v.reserve(int num);   //num表示预留空间大小

vector容器内部维护的实际上是一个数组,数组的地址是连续的,而vector在定义时会根据不同的系统算法分配出大于容器大小(size)的容量(capacity),当容器被插满数据的时候(size==capacity),容器会自动扩展其容量,因为数组要求使用连续的内存空间,容器动态扩展实质是将之前的数据全部拷贝到一个较大容量的新空间中,因此每次扩展需要额外的内存消耗。

如在不使用reserve函数预留空间时向一个定义好的vector中插入100000个元素,统计其动态扩展的次数:

 1 void test01() // 不预留空间时扩展的次数
 2 {
 3     vector<int> v;  // vector容器定义时空间有限
 4     cout << "vector初定义时的容量:" << v.capacity() << endl;
 5 
 6     int num = 0; //用于统计动态扩展的次数
 7     int * pointer = NULL; 
 8     for (int i = 0; i < 100000; i++)
 9     {
10         v.push_back(i);
11 
12         if (pointer != &v[0])
13         {
14             pointer = &v[0];
15             num++;
16         }
17     }
18 
19     cout << "不使用预留空间时的动态分配的次数:" << num << endl;
20 }

以上代码的输出为:

技术图片

 

 当向vector中插入100000个数时,中间动态内存扩展了30次,这在程序运行中占用了很大一部分时间消耗,因此在知道容器需要使用的大致容量的时候可以通过reserve函数预留空间,即一次性分配足够的空间来减少动态扩展次数,比如:

 1 void test02() // 使用reserve预留空间
 2 {
 3     vector<int> v;
 4     v.reserve(100000);
 5     cout << "vector预留后的容量:" << v.capacity() << endl;
 6 
 7     int num = 0; //用于统计动态扩展的次数
 8     int * pointer = NULL;
 9     for (int i = 0; i < 100000; i++)
10     {
11         v.push_back(i);
12 
13         if (pointer != &v[0])
14         {
15             pointer = &v[0];
16             num++;
17         }
18     }
19 
20     cout << "使用预留空间时的动态分配的次数:" << num << endl;
21 }

技术图片

 

以上是关于vector容器使用reserve预留空间的主要内容,如果未能解决你的问题,请参考以下文章

C++ vector的reserve和resize详解

vector容器swapreserveresize

STL容器的reserve()函数和resize()函数解析

C++之vector的用法整理

问题:vector的reserve并不会改变size的大小

C++ 提高教程 STL vector容器-预留空间