std::vector::reserve(0);
是否合法,它会做什么?
没有任何禁止它的东西。 reserve
的效果是:
调用 reserve() 后,如果重新分配内存,则 capacity() 大于等于 reserve 的参数值;否则与之前的 capacity() 值相等。只有当前的 capacity() 小于 reserve 的参数值时才会进行重新分配内存。1
由于 capacity()
的值永远不可能小于0(它是无符号的),这永远不会产生任何影响;它永远不会导致重新分配内存。
1. C++标准,[vector.capacity]
[vector.capacity]
的引用,但更完整的引用显然不会有害,所以我进行了编辑。 - Jerry Coffin是的,它是一个合法的无操作。
如果
new_cap
大于当前capacity()
,则会分配新的存储空间,否则该方法什么也不做。
(来源,强调我的。)
由于capacity()
始终大于等于0(因为size_type
是无符号的),传递0保证什么也不做。
这是合法的,也不会占用任何空间。但如果调用低于其容量,则该调用将不起作用。
reserve
的参数小于或等于当前容量,则reserve
不执行任何操作。由于容量不能为负数,因此没有办法使0严格大于容量。 - James Kanze根据C++标准
在reserve()之后,如果进行重新分配,则capacity()大于或等于reserve的参数;否则等于capacity()的先前值。 仅当当前容量小于reserve()的参数时,才会在此时发生重新分配。
因此,如果reserve的参数等于0,则不会进行重新分配。
该函数本身仅在一种情况下引发异常
如果n > max_size(),则抛出length_error。
请注意,reserve(0)与resize(0)不相同。 在后一种情况下,将删除向量的所有元素。
void reserve (size_type n);
文档提供了明确的答案:
将容器的容量增加到大于或等于
new_cap
的值。如果new_cap
大于当前capacity()
,则会分配新的存储空间;否则该方法不执行任何操作。
capacity()
返回一个不能为负数的值。因此,对于new_cap
传递零总是属于第二种情况——即函数不执行任何操作。
std::vector::reserve()
,您可以确定要预留的内存量,在这种情况下为零。