std::vector::reserve(0);
合法吗?它会做什么?
答案 0 :(得分:21)
没有什么可以禁止的。 reserve
的效果是:
在reserve()之后,capacity()大于或等于reserve的参数if 重新分配发生;并且等于capacity()的先前值。重新分配发生 此时,当且仅当当前容量小于reserve()的参数时。 1
由于capacity()
的值永远不会小于0(它是无符号的),这永远不会有任何影响;它永远不会导致重新分配。
1. c ++标准,[vector.capacity] 功能
答案 1 :(得分:7)
是的,这是合法的无操作。
如果
new_cap
大于当前capacity()
,则会分配新存储空间,否则该方法不执行任何操作。
(Source,强调我的。)
由于capacity()
始终为> = 0(由于size_type
未签名),因此保证零传递无效。
答案 2 :(得分:2)
这是合法的,不会保留任何空间。虽然如果呼叫低于其容量,呼叫将无效。
答案 3 :(得分:2)
根据C ++标准
在reserve()之后,capacity()大于或等于参数 如果重新分配发生,则保留;并等于之前的值 容量()否则。 当且仅在此时重新分配 如果当前容量小于reserve()的参数。
因此,如果reserve的参数等于0,那么就不会重新分配。
函数本身仅在一种情况下抛出异常
抛出:length_error如果n> MAX_SIZE()。
考虑到reserve( 0 )
不等同于resize( 0 )
。在最后一种情况下,矢量的所有元素都将被删除。
答案 4 :(得分:1)
documentation为此提供了明确的答案:
将容器的容量增加到大于或等于
new_cap
的值。如果new_cap
大于当前capacity()
,则会分配新存储空间,否则该方法不会执行任何操作。
capacity()
返回一个不能为负数的值。因此,new_cap
的零传递总是属于第二类 - 即函数什么也不做。
答案 5 :(得分:1)
void reserve (size_type n);
如果n大于当前矢量容量,则该函数会使容器重新分配其存储,将其容量增加到n(或更大)。
在所有其他情况下,函数调用不会导致重新分配,矢量容量也不会受到影响。
答案 6 :(得分:0)
首先,您应该尝试了解Vector的工作原理。它是一个保留内存的数组,以便在需要存储新值时使用它,以便更快更有效地执行插入操作。
使用std::vector::reserve()
,您可以确定要保留的内存量(在您的情况下为零)。
如果你想向向量添加另一个值并且保留空间为零,它将完全没有问题,但操作会更慢。如果你想为很多值做这件事可能会有问题,但如果你只做几次,你可能不会注意到这一点。