请问reserve 与reservation的用法及意义上的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问reserve 与reservation的用法及意义上的区别相关的知识,希望对你有一定的参考价值。

参考技术A reserve既可作及物动词也可作名词
reservation只能作名词
作名词时两者意义相等可做“保护区””预定“的意思
用法有make a (预定)natural reserve(自然保护区)
reserve作及物动词时表示预定/保留某物,直接加sth.就行了
后面还可以加些修饰,如for/to+目的

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 }

技术图片

 

以上是关于请问reserve 与reservation的用法及意义上的区别的主要内容,如果未能解决你的问题,请参考以下文章

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

std::vector::resize() 与 std::vector::reserve()

[mybatis]Dao对象与Example对象的用法

vector reserve与resize区别

性能优化篇:小心“STL 低效率用法”所带来的性能开销

reserve是啥意思中文翻译