ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ### what ***** reserve成员函数允许你最小化必须进行的重新分配的次数,因而可以避免真分配的开销和迭代器/指针/引用 失效。 * reserve(Container::size\_type n)强制容器把它的容量改为至少n,提供的n不小于当前大小。这一般强迫 进行一次重新分配,因为容量需要增加。(如果n小于当前容量,vector忽略它,这个调用什么都不 做,string可能把它的容量减少为size()和n中大的数,但string的大小没有改变。在我的经验中,使用 reserve来从一个string中修整多余容量一般不如使用“交换技巧”,那是条款17的主题。) ### how ***** 类似于realloc操作: * 分配新的内存块,它有容器目前容量的几倍。在大部分实现中,vector和string的容量每次以2为因数增 长。也就是说,当容器必须扩展时,它们的容量每次翻倍。 * 把所有元素从容器的旧内存拷贝到它的新内存。 * 销毁旧内存中的对象。 * 回收旧内存 ### why ***** 假定你想建立一个容纳1-1000值的vector。没有使用reserve,你可以像这样来做 ``` vector v; for (int i = 1; i <= 1000; ++i) v.push_back(i); ``` 在大多数STL实现中,这段代码在循环过程中将会导致2到10次重新分配。(10这个数没什么奇怪的。记住 vector在重新分配发生时一般把容量翻倍,而1000约等于2^10。) 把代码改为使用reserve,我们得到这个: ``` vector v; v.reserve(1000); for (int i = 1; i <= 1000; ++i) v.push_back(i); ``` 这在循环中不会发生重新分配。 ` ` ### 调用reserve不改变容器中对象的个数。