【发布时间】:2015-01-04 14:32:03
【问题描述】:
std::vector::reserve(0); 合法吗?它会做什么?
【问题讨论】:
-
我相信这是合法的,而且可能什么都不做。
-
我们可以安全地假设大小(以及更相关的容量)将为零或更大。
-
@MikeSeymour 是的,我想说点别的,但结果不对。我刚刚删除了那部分。 :P
std::vector::reserve(0); 合法吗?它会做什么?
【问题讨论】:
没有什么可以禁止的。 reserve的效果是:
reserve() 之后,capability() 大于等于reserve 的参数,如果 发生重新分配;否则等于 capacity() 的前一个值。发生重新分配 此时当且仅当当前容量小于reserve()的参数。1
由于capacity() 的值永远不能小于0(它是无符号的),这永远不会有任何影响;它永远不会导致重新分配。
1. c++标准,[vector.capacity]
【讨论】:
[vector.capacity] 参考,但使参考更完整一点显然并没有什么坏处,所以我已经编辑了。
是的,这是合法的禁止操作。
如果
new_cap大于当前capacity(),则分配新的存储空间,否则该方法不执行任何操作。
(Source,强调我的。)
由于capacity() 将始终>= 0(由于size_type 是无符号的),因此传递零保证不会执行任何操作。
【讨论】:
根据 C++ 标准
reserve() 之后,capacity() 大于等于 如果发生重新分配,则保留;并且等于之前的值 容量()否则。 重新分配此时发生当且仅 如果当前容量小于reserve()的参数。
因此,如果reserve 的参数等于0,则根本不会重新分配。
函数本身只在一种情况下抛出异常
如果 n > max_size(),则抛出:length_error。
考虑到reserve( 0 ) 不等于resize( 0 )。在最后一种情况下,向量的所有元素都将被删除。
【讨论】:
这是合法的,不会保留空间。虽然如果调用低于其容量,调用将不会执行任何操作。
【讨论】:
reserve的参数小于或等于当前容量,reserve是空操作。由于容量不能为负数,所以0 不可能严格大于。
documentation 对此提供了明确的答案:
将容器的容量增加到大于或等于
new_cap的值。如果new_cap大于当前capacity(),则分配新的存储空间,否则该方法什么也不做。
capacity() 返回一个不能为负的值。因此,为 new_cap 传递零总是属于第二类 - 即当函数什么都不做时。
【讨论】:
void reserve (size_type n);
如果 n 大于当前向量容量,该函数会导致容器重新分配其存储空间,将其容量增加到 n(或更大)。
在所有其他情况下,函数调用不会导致重新分配,并且向量容量不受影响。
【讨论】:
首先,您应该尝试了解 Vector 的工作原理。它是一个保留内存的数组,以便在您需要存储新值以尝试更快更高效地执行插入操作时使用它。
使用std::vector::reserve(),您可以确定要保留的内存量,在您的情况下为零。
如果你想为你的向量添加另一个值并且保留空间为零,它会完全没有问题,但操作会更慢。如果您想对很多值执行此操作,可能会出现问题,但如果您只执行几次,您可能不会注意到这一点。
【讨论】: