Effective STL学习笔记-条款13|14
来源:互联网 发布:珠宝设计绘图软件 编辑:程序博客网 时间:2024/06/05 07:37
条款13 尽量使用vector和string来代替动态分配的数组
条款14 使用reserve来避免不必要的重新分配
尽量使用vector和string来代替动态分配的数组
主要是考虑到使用动态分配内存的释放问题。所以建议使用容器来代替。
使用reserve来避免不必要的重新分配
关于容器需要知道的:
1. 分配新的内存块,它有容器目前容量的几倍。在大部分实现中,vector和string的容量每次以2为因数增
长。也就是说,当容器必须扩展时,它们的容量每次翻倍。
2. 把所有元素从容器的旧内存拷贝到它的新内存。
3. 销毁旧内存中的对象。
4. 回收旧内存。
显然,重新分配,回收内存的代价是很高的。
reserve成员函数允许你最小化必须进行的重新分配的次数,因而可以避免真分配的开销和迭代器/指针/引用
失效。但在我解释reserve为什么可以那么做之前,让我简要介绍有时候令人困惑的四个相关成员函数。在标
准容器中,只有vector和string提供了所有这些函数。
● size()告诉你容器中有多少元素。它没有告诉你容器为它容纳的元素分配了多少内存。
● capacity()告诉你容器在它已经分配的内存中可以容纳多少元素。那是容器在那块内存中总共可以容纳
多少元素,而不是还可以容纳多少元素。如果你想知道一个vector或string中有多少没有被占用的内
存,你必须从capacity()中减去size()。如果size和capacity返回同样的值,容器中就没有剩余空间了,而
下一次插入(通过insert或push_back等)会引发上面的重新分配步骤。
● resize(Container::size_type n)强制把容器改为容纳n个元素。调用resize之后,size将会返回n。如果n小于
当前大小,容器尾部的元素会被销毁。如果n大于当前大小,新默认构造的元素会添加到容器尾部。
如果n大于当前容量,在元素加入之前会发生重新分配。
● reserve(Container::size_type n)强制容器把它的容量改为至少n,提供的n不小于当前大小。这一般强迫
进行一次重新分配,因为容量需要增加。(如果n小于当前容量,vector忽略它,这个调用什么都不
做,string可能把它的容量减少为size()和n中大的数,但string的大小没有改变。在我的经验中,使用
reserve来从一个string中修整多余容量一般不如使用“交换技巧”,那是条款17的主题。)
一个小示例
例如,假定你想建立一个容纳1-1000值的vector。没有使用reserve,你可以像这样来做:
vector<int> v;for (int i = 1; i <= 1000; ++i) v.push_back(i);
在大多数STL实现中,这段代码在循环过程中将会导致2到10次重新分配。(10这个数没什么奇怪的。记住
vector在重新分配发生时一般把容量翻倍,而1000约等于210。)
把代码改为使用reserve,我们得到这个:
vector<int> v;v.reserve(1000);for (int i = 1; i <= 1000; ++i) v.push_back(i);
这在循环中不会发生重新分配。
事实上我再vs2015编译器上并没有测试出vector的重新分配这种策略。
这里我先不做过多介绍了。
- Effective STL学习笔记-条款13|14
- 【Effective STL】条款13-18学习笔记
- 【Effective STL】条款1-5学习笔记
- 【Effective STL】条款6-12学习笔记
- Effective STL学习笔记-条款1
- Effective STL学习笔记-条款7
- Effective STL学习笔记-条款8-9
- Effective STL学习笔记-条款19
- Effective STL学习笔记-条款20
- Effective STL学习笔记-条款21
- Effective STL学习笔记-条款23
- Effective STL学习笔记-条款24
- Effective STL学习笔记-条款30
- Effective STL学习笔记-条款31
- Effective STL学习笔记-条款32
- Effective STL学习笔记-条款33
- Effective STL学习笔记-条款34
- Effective STL学习笔记-条款36
- Unity 鼠标跟随点击位置
- Qt中tcp传输文件遇到的问题
- Linked List Random Node问题及解法
- Maven学习记录3——创建、编译、打包、运行项目
- 机器学习笔记4:TensorFlow基础入门介绍
- Effective STL学习笔记-条款13|14
- 富文本编辑器的使用
- .net redis数据缓存(一) redis在Windows环境中的安装
- 使用Hanlder的注意事项
- Session.load()和get()方法区别
- 【PAT】【Advanced Level】1077. Kuchiguse (20)
- 你是如何学习 Linux 编程的?
- sssp整合&分页之完成添加操作之显示页面&使用JPA二级缓存
- 求一个数组的第K大的数