C++中的rerve函数

更新时间:2023-06-13 10:32:38 阅读: 评论:0

C++中的rerve函数
C++中的rerve函数
内存怎么超频在看hashtable时,看到有⼀段源码是:
buckets.d(), n_buckets,(node*)0);
四正念什么num_elements =0;
buckets是hashtable所维护的⼀个管理“开链”的数组vector,这段代码的⽬的就是为了为这个vector做⼀个预先的初始化。
我们知道,vector是可以动态改变容量的,加上并不了解rerve这个函数,所以到这⾥产⽣了个疑惑:这个rerve()是⼲嘛的?
原来,尽管vector容器本⾝具有⾜够优秀的性质可以动态扩容,但是“有”不代表“好、快”,⽐如在运⾏下⾯的代码时:
vector<int> v;
for(int i =1; i <=1000;++i) v.push_back(i);
这个过程中vector v要扩容10次左右,要知道,vector容器的每⼀次扩容,就意味着⼀次重新分配,这包含着重新分配空间、复制内容、迭代器的重新指向操作,开销⽐较⼤。这时,⼀个rerve(1000)就会免掉这些开销。
其次,由于重新分配,迭代器也会重置,程序中迭代中的迭代器很有可能失效,如下⾯代码:
vector<int> vec;
for(int i=1;i<6;i++){
度分布vec.push_back(i);
去公园的英文
}
vector<int>::iterator it = vec.begin();
数加
cout<<vec.capacity()<<","<<*it<<endl;
for(int i=6;i<20;i++){
vec.push_back(i);
cout<<vec.capacity()<<","<<*it<<endl;
肉糜炖蛋it++;
大学日记}
钻石挑选
可以看到,上⾯的迭代器it会进⾏⾃加迭代,我们先讲vector赋为[1, 2, 3, 4, 5],这时容量为8;然后继续向vec中加元素,加到8个时⼀切还正常,到第9个it就出问题了(报错我没有截图)。这就是因为容量翻倍不是简单的在以前vector后⾯进⾏拼接,⽽是重新分配内存,重新配置迭代器,以前的迭代器就不起作⽤了,原来的iterator就超出了这个vector的作⽤域,产⽣报错。
综上两种情况,⼀个rerver()操作还是很有必要的。

本文发布于:2023-06-13 10:32:38,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/944257.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:迭代   动态   报错
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图