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