Effective STL 12 STL 使用reserve来避免不必要的重新分配
来源:互联网 发布:梦里花落知多少陈曦 编辑:程序博客网 时间:2024/06/10 16:21
************************************************
时间:2013年10月18日
作者:常保龙
地点:核所C105
************************************************
关于STL容器,最神奇的事情之一是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据。(要知道这个最大值,只要调用名叫max_size的成员函数。)对于vector和string,只要需要更多空间,就以realloc等价的思想来增长。这个类似于realloc的操作有四个部分:
1、分配新的内存块,它有容器目前容量的几倍。在大部分实现中,vector和string的容量每次以2为因数增长。也就是说,当容器必须扩展时,它们的容量每次翻倍。
2、把所有元素从容器的旧内存拷贝到它的新内存。
3、销毁旧内存中的对象。
4、回收旧内存。
给了所有的分配,回收,拷贝和析构,你就应该知道那些步骤都很昂贵。当然,你不会想要比必须的更为频繁地执行它们。如果这没有给你打击,那么也许当你想到每次这些步骤发生时,所有指向vector或string中的迭代器、指针和引用都会失效时,它会给你打击的。这意味着简单地把一个元素插入vector或string的动作也可能因为需要更新其他使用了指向vector或string中的迭代器、指针或引用的数据结构而膨胀。
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中修整多余容量一般不如使用“交换技巧”。
- Effective STL 12 STL 使用reserve来避免不必要的重新分配
- Effective STL: 使用reserve来避免不必要的内存分配
- effective stl 第14条:使用reserve来避免不必要的重新分配
- STL学习笔记之使用reserve来避免不必要的重新分配
- 使用vector::reserve来避免不必要的重新分配
- 使用vector::reserve来避免不必要的重新分配
- 条款14:使用reserve来避免不必要的重新分配
- 使用reserve来避免不必要的重新分配 分享
- 使用vector::reserve来避免不必要的重新分配
- 使用reserve来避免不必要的重新分配
- 使用vector::reserve来避免不必要的重新分配
- 使用reserve来避免不必要的重新分配
- 使用reserve来避免不必要的重新分配
- 使用vector::reserve来避免不必要的重新分配
- 《Effective STL》读书笔记七:Item 13:尽量使用vector和string来代替动态分配的数组 Item 14: 使用reserve来避免不必要的内存重分配
- C++标准库---使用reserve来避免不必要的重新分配
- C++标准库---使用reserve来避免不必要的重新分配 http://lib.csdn.net/article/cplusplus/29707
- 在插入元素前可以使用reserve避免不必要的内存分配
- SCSF - Part 6 Constructor Injection in the CAB
- jsonview json查看工具
- python简单操作redis
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序
- 安卓开发之JNI编程详解
- Effective STL 12 STL 使用reserve来避免不必要的重新分配
- java作业:使一串数字循环输出
- Windows phone UI流畅度优化
- windows下操作mysql
- 在MFC,Win32程序中向控制台(Console)窗口输出调试信息
- samba文件夹权限设置
- unix/linux下监控进程状态及自动重启进程
- Android的支付接入(一):支付宝
- 三大框架整合ssh(二)------DAO层