是std :: vector :: reserve(0);法律?

时间:2014-11-07 18:06:02

标签: c++ c++11 vector stl

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

7 个答案:

答案 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(),您可以确定要保留的内存量(在您的情况下为零)。

如果你想向向量添加另一个值并且保留空间为零,它将完全没有问题,但操作会更慢。如果你想为很多值做这件事可能会有问题,但如果你只做几次,你可能不会注意到这一点。