C++中的reserve函数

C++中的reserve函数

在看hashtable时,看到有一段源码是:

buckets.reserve(n_buckets);
buckets.insert(buckets.end(), n_buckets, (node*) 0);
num_elements = 0;

buckets是hashtable所维护的一个管理“开链”的数组vector,这段代码的目的就是为了为这个vector做一个预先的初始化。

我们知道,vector是可以动态改变容量的,加上并不了解reserve这个函数,所以到这里产生了个疑惑:这个reserve()是干嘛的?

直到看到https://blog.csdn.net/bichenggui/article/details/4690175这篇,终于对这个东西有了初步的了解。

原来,尽管vector容器本身具有足够优秀的性质可以动态扩容,但是“有”不代表“好、快”,比如在运行下面的代码时:

vector<int> v;
for (int i = 1; i <= 1000; ++i) v.push_back(i);

这个过程中vector v要扩容10次左右,要知道,vector容器的每一次扩容,就意味着一次重新分配,这包含着重新分配空间、复制内容、迭代器的重新指向操作,开销比较大。这时,一个reserve(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的作用域,产生报错。

综上两种情况,一个reserver()操作还是很有必要的。

  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值