Term14:使用reserve避免不必要的重新分配

        对于STL容器,最了不起的一点就是,它们会自动增长以便容纳下你放入其中的数据。当然,这里有一个前提条件:你没有超出它们的最大限制条件(我们可以用名为max_size()的成员函数来知道这一最大限制数量)

在Vs2022上,打下如下代码:

vector<int> vec;
cout << "vec.max_size() = " << vec.max_size() << endl;
string str;
cout << "str.max_size() = " << str.max_size() << endl;

运行结果:

下面以vector和string容器为例子,说起容器的动态扩容机制。

当vector.size() == vector.capacity()时,再往容器中push_back(elem)时
vector or string 容器就会自动做动态扩容,扩容机制如下:
1-分配一块大小为当前容器对象容量的某个倍数(通常为2倍)的新内存。在大多数的实现中,vector和string的容量每次以2倍进行增长,即每当容器需要扩张时,他们的容量即加倍。
2-把容器的所有元素从旧的内存复制(拷贝)到新的内存
3-析构掉旧内存中的对象
4-释放旧内存

        考虑到上述操作中涉及到的大量的分配,释放,复制拷贝和析构等步骤,容器扩容时开销会比较大,自然你的代码效率就会比较低下。因此,为了尽量减少重新分配内存的次数,从而达到提高代码效率的目的,term14给我们提供了2种方法来do到这一点!

        way1:在coding前事先大概知道容器中最终会有多少个对象,此时可以直接使用.reserve(number)方法来do。

//比如:年级有将近400名学生,编写程序存储他们的学号和姓名
vector<std::pair<int, string>> vec;
vec.reserve(400);
//reserve预留了空间后,vec.capacity() == 400了!
//push 400名学生的data
//...

        way2:不管3721,先给该容器预留一个足够大的内存空间,即上来就.reserve(big number)。当把所有的数据都加入之后,再用.swap()方法去除多余的元素(此去除Sequence容器中多余元素的套路在Effective STL term17中会总结到)。

Effective STL Term17

//比如:我要存储大量的人口的身份证信息
vector<PersonInfo> vec;
vec.reserve(1000000);
//reserve预留了空间后,vec.capacity() == 1000000了!
//push 所有人口的data
//...
//再用term17教的方法来去除多余元素即可
//...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fanfan21ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值