为什么使用std :: vector :: reserve很有用?

时间:2014-05-21 11:11:59

标签: c++ vector

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

简单来说,就是效率。

答案 2 :(得分: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.

因此,有助于在理想情况下为您的所有数据提供足够数据而不留下任何数据的值上调整矢量大小。减少矢量的调整大小时间将加快您的应用程序

答案 3 :(得分:1)

出于效率的原因 - 你可以根据需要为所需元素分配内存,如果你最初知道的话 - 这样矢量可以一次分配所有内容,如果它超过分配的大小就不必增长。 / p>

  

[4] Reserve()会手动重新分配。主要原因   使用reserve()是效率:如果你知道你的容量   矢量必须最终成长,然后它通常更有效   一次分配该内存而不是依赖于自动   重新分配计划。使用reserve()的另一个原因是这样的   你可以控制迭代器的失效。

Source