std::vector::reserve(0);是否合法?

13

std::vector::reserve(0);是否合法,它会做什么?


我相信这是合法的,也许什么都不会发生。 - Basile Starynkevitch
我们可以安全地假设大小(更相关的是容量)将会是零或更大。 - Mike Seymour
@MikeSeymour 是的,我本来想说别的话,但表达得不太好,所以我删掉了那部分。 :P - NPS
7个回答

25

没有任何禁止它的东西。 reserve 的效果是:

调用 reserve() 后,如果重新分配内存,则 capacity() 大于等于 reserve 的参数值;否则与之前的 capacity() 值相等。只有当前的 capacity() 小于 reserve 的参数值时才会进行重新分配内存。1

由于 capacity() 的值永远不可能小于0(它是无符号的),这永远不会产生任何影响;它永远不会导致重新分配内存。


1. C++标准,[vector.capacity]


1
我假设你在引用C++标准?我认为你应该明确说明并提供引用的标准版本。 - NPS
1
好的,但我仍然认为您应该明确说明您在引用C++标准,以便其他用户在以后查看您的答案时能够知道。 - NPS
@NPS:我认为大多数关心此事的人都会认出[vector.capacity]的引用,但更完整的引用显然不会有害,所以我进行了编辑。 - Jerry Coffin

7

是的,它是一个合法的无操作。

如果new_cap大于当前capacity(),则会分配新的存储空间,否则该方法什么也不做。

(来源,强调我的。)

由于capacity()始终大于等于0(因为size_type是无符号的),传递0保证什么也不做。


2

这是合法的,也不会占用任何空间。但如果调用低于其容量,则该调用将不起作用。


2
如果reserve的参数小于或等于当前容量,则reserve不执行任何操作。由于容量不能为负数,因此没有办法使0严格大于容量。 - James Kanze
2
你打错字了:“then”应该是“than”。我本来想自己修正,但它说编辑至少要有6个字符...真是愚蠢... - NPS

2

根据C++标准

在reserve()之后,如果进行重新分配,则capacity()大于或等于reserve的参数;否则等于capacity()的先前值。 仅当当前容量小于reserve()的参数时,才会在此时发生重新分配。

因此,如果reserve的参数等于0,则不会进行重新分配。

该函数本身仅在一种情况下引发异常

如果n > max_size(),则抛出length_error。

请注意,reserve(0)与resize(0)不相同。 在后一种情况下,将删除向量的所有元素。


1
void reserve (size_type n);

如果 n 大于当前向量容量,则该函数会导致容器重新分配其存储空间,将其容量增加到 n(或更大)。
在所有其他情况下,函数调用不会导致重新分配,并且向量容量不受影响。

1

文档提供了明确的答案:

将容器的容量增加到大于或等于new_cap的值。如果new_cap大于当前capacity(),则会分配新的存储空间;否则该方法不执行任何操作。

capacity()返回一个不能为负数的值。因此,对于new_cap传递零总是属于第二种情况——即函数不执行任何操作。


5
注意:没有一个维基网站是“唯一的文档”。 - Lightness Races in Orbit

0
首先,您应该尝试理解 Vector 的工作原理。它是一个数组,预留内存以便在需要存储新值时使用,并尝试使插入操作更快速和高效。
使用 std::vector::reserve(),您可以确定要预留的内存量,在这种情况下为零。
如果您想向向量添加另一个值,并且保留空间为零,则不会出现任何问题,但操作将变得更慢。 如果您要做很多次这样的操作,那可能就会成为问题,但如果只做几次,您可能不会注意到这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接