题
参考文章 Gotw54 通过HerbSutter,他解释说关于
正确的方式"收缩适应"一个 矢量或双端和
正确的方式完全清楚的一个向量或 双端
我们可不可以使用
container.resize()
和container.clear()
对于上述任务 或者我是不是错过什么?
解决方案
有两个不同的东西,这一矢量持有: size
Vs capacity
.如果你只是 resize
矢量,还没有保证的能力(多少内存保留)必须改变。 resize
是一个运作有关有多少是你使用,没有多少矢量的能力。
这样的例子。
size == how much you are using
capacity == how much memory is reserved
vector<int> v(10);
v.resize(5); // size == 5 but capacity (may or may) not be changed
v.clear() // size == 0 but capacity (may or may) not be changed
在结束时,容量不应改变了在每一次操作,因为这会带来很多的内存配置/释放开销。他是说如果你需要的"释放"本 存保留 通过矢量,这样做。
其他提示
既没有调整()也不清楚()工作。的 .capacity()
一矢量保证至少一样大的流 size()
矢量,并保证至少一样大 reserve()
d能力。此外,这一点。capacity()
不缩小,因此它也是至少在大,因为任何之前的 size()
或 reserve()
通货膨胀.
现在, .capacity()
一矢量的仅仅是存它有保留。往往并不是所有的记忆cotains的对象。调整消除对象,但是不回收的存储器。一矢量只能回收其存缓冲区时,分配一个较大的缓冲区。
交换的伎俩的作品复制所有符的较小,更适当的记忆缓冲区。之后,原始记忆缓冲区可进行再循环。这似乎违反了以前的声明,内存缓冲区的一个向量只能增长。然而,与交换的伎俩,你暂时有 2 矢量。
在矢量的大小和容量。它可能持有X的元素,但有初始化存储器中存储Y元素更多。在一个典型的实现删除,调整(当调整,以更小的尺寸)和清除不影响的能力:矢量保持存储器周围本身,你应该要添加新的项目,它在以后的时间。