在C++中,您可以使用push_back方法向向量添加元素。该方法会修改向量的大小。 那么使用std::vector::reserve的目的是什么?我何时应该使用它呢?
使用std::vector::reserve的目的是为向量预留空间,以避免多次重新分配内存。当您知道要向向量添加大量元素时,使用reserve可以提高性能。
当你知道至少有n个元素会进入向量时,可以使用reserve。重新调整容器大小是一项昂贵的操作——你需要分配新的内存,将旧内容复制到其中,然后删除旧向量。如果你默认知道将获得至少10000个元素,最好为向量保留大小,而不是让向量重新分配比必要更多次的内存。
简单来说,这都是关于效率的问题。
它可以用来确保迭代器的有效性,或作为优化。当向向量添加元素时,如果新大小大于容量,则必须重新分配向量,将所有现有元素复制(或移动)到新缓冲区中。这会使向量中的所有迭代器无效,并且可能很昂贵。reserve函数确保最小容量。如果您预先知道最大大小并对其进行保留,则添加元素永远不会使新元素前面的迭代器无效,并且永远不需要复制。(对于大多数代码,迭代器有效性的问题强制使用reserve。)
push_back
,而且能够明确知道没有迭代器时,通常不需要调用 reserve
(当你无法设置最终元素数量的合理上限时,也不能有效地使用它)。 - James Kanzepush_back
,这可能是最常见的情况。在插入任意点时,通常可以忽略迭代器。 - James Kanze调整向量大小可能会显著降低执行速度(例如在向其添加大量数据时)
参考资料如下:
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.
因此,最好在一个理想的值上调整向量大小,以便您拥有足够的空间存储所有数据且不会浪费。向量的缩小调整时间将加快应用程序的运行速度。
operator new/delete
的世界中没有realloc
等效物。要“扩展”分配需要单独进行分配,需要大量复制或移动,然后释放旧内存。通过“声明”您的数量意图,您可以避免这种微妙之处(一只坏兔子很可爱,但一百万只坏兔子就是一个大问题)。 - WhozCraig