2014-05-21 150 views
0

在C++中,只需使用push_back方法即可将元素添加到矢量中。该方法修改矢量的大小。 那么使用std :: vector :: reserve的目标是什么?我应该什么时候使用它?为什么使用std :: vector :: reserve有用?

+2

它是最小化或彻底消除缓冲区调整大小和引入的命中(复制/移动会变得昂贵,特别是对于大型对象的数量)。在'operator new/delete'宇宙中没有'realloc'等价物。要“扩展”分配,需要单独分配,复制或移动,然后释放旧内存。通过“声明”你的意图,你可以避免这种细微差别。一只卑鄙的兔子很可爱。百万平均的兔子是一个问题)。 – WhozCraig

回答

3

当您知道至少有n个元素进入矢量时,您可以使用保留。调整容器大小是一项代价高昂的操作 - 您分配新内存,将旧内容复制到内存中,然后删除旧的内存。如果您默认知道您将获得至少10000个元素,则最好为矢量保留大小,而不是让矢量重新分配内存超过必要的次数。

简而言之,就是效率。

+3

比效率更重要:它确保迭代器保持有效。 –

2

调整载体可以显著降低执行速度(例如追加大量的数据给它时)

基准表示:

This effectively increases the container size by one, which causes an automatic 
reallocation of the allocated storage space if -and only if- the new vector size 
surpasses the current vector capacity. 

所以有助于尺寸的向量上的值,其中你理想情况下,对于您的所有数据来说都足够了,而且还没有剩下。矢量缩减的调整大小时间将加速您的应用程序

1

这是出于效率的原因 - 您可以根据需要为内存分配尽可能多的元素,如果您知道初始化 - 这种方式向量可以一次分配所有内容,并且如果超过分配的大小将不会增加。

[4] Reserve()会导致手动重新分配。 使用reserve()的主要原因是效率:如果您知道您的最终容量必须增长,那么通常更有效率的是一次分配该内存,而不是依靠自动的 重新分配方案。使用reserve()的另一个原因是你可以控制迭代器的失效。

Source

4

它可以用来保证迭代器的有效性,或作为优化。向矢量添加元素时,如果新大小大于容量,则矢量必须重新分配,将所有现有元素复制(或移动)到新缓冲区中。这使所有迭代器都无效,并且可能很昂贵。储备功能确保最小的容量。如果您事先知道最大大小并对其进行预留,那么添加元素将永远不会使新元素前面的迭代器失效,并且永远不会需要复制。 (对于大多数代码,这是迭代器有效性的问题,强制使用保留。)

+0

因此,作为一个最佳实践的问题,应该总是呼叫储备以避免这些副作用? – Brian

+1

+1应该注意的是,即使有一个*充足的保留缓冲区,一个“插入(v.begin()...)”,并且世界在迭代器有效性方面崩溃。他们*全部*在下巴上,即使没有调整大小。 – WhozCraig

+2

@staticx不一定。很多时候,例如,在相对较小的循环中执行'push_back',显然没有迭代器。在这种情况下,调用保留没有意义(当你不能在最终元素数上设置合理的上限时,你也不能真正有效地使用它)。 –

相关问题