参考文章 Gotw54 通过HerbSutter,他解释说关于

  1. 正确的方式"收缩适应"一个 矢量或双端和

  2. 正确的方式完全清楚的一个向量或 双端

我们可不可以使用 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元素更多。在一个典型的实现删除,调整(当调整,以更小的尺寸)和清除不影响的能力:矢量保持存储器周围本身,你应该要添加新的项目,它在以后的时间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top