我想了解std::vector::reserve()
在以下情况中的行为:
reserve(N)
一个接一个地被多次调用。
早期的reserve(N1)
会被加起来还是被覆盖?reserve(N1)
被最新的通话覆盖,
那么如果最新的reserve(Nn)
需要更少的插槽,会发生什么?vector
个X元素,则声明push_back()
后,
然后我们打电话给reserve(N)
。已经push_back()
X.
在N
计算的元素?vector
有一些X推送元素,现在如果我们
push_back()
还有1个元素(X + 1),然后该对象必须
得到重新安置;但我们尚未执行push_back()
。什么
如果我们现在拨打reserve()
,会发生什么?对象是否会重新定位
马上?如果没有,那么如何保留空间?答案 0 :(得分:11)
reserve()
只是确保向量的已分配内存至少大到足以包含作为参数传递的项目数。因此...
reserve()
时,向量会分配尽可能多的内存,以便存储传递给reserve()
的项目数。引用实际标准:
void reserve(size_type n)
如果
n
小于或等于capacity()
,则此调用无效。 否则,它是分配额外内存的请求。如果 请求成功,然后capacity()
大于或等于n
; 否则,capacity()
不变。在任何一种情况下,size()
都是 不变。
答案 1 :(得分:3)
假设
reserve(N)
一个接一个地被多次调用。早期的reserve(N1)
会被加起来还是被覆盖?
与std::string
不同,无法为reserve()
调用std::vector
来缩小capacity()
。使用小于当前值的参数调用reserve()
capacity()
是无操作。因此,增加当前容量的最后一次reserve()
呼叫将保持良好状态。
如果较早的
reserve(N1)
被最新的呼叫覆盖,那么如果最新的reserve(Nn)
要求的插槽数量减少会怎样?
使用小于当前reserve()
的参数调用capacity()
是无操作。
声明向量后如果我们只有push_back()X元素,那么我们调用reserve(N)。已经将push_back()X元素计入N吗?
reserve()
只需分配(预留)足够数量的元素即可。请注意,在调用reserve()
后,只更改了向量的capacity()
,size()
仍然不受影响。如果您需要创建尽可能多的元素而不仅仅是保留内存,那么您应该使用{{ 1}}。
假设,如果向量具有一些
resize()
推送元素,现在如果我们X
多了1个元素push_back()
,则该对象必须重新定位;但我们尚未执行(X+1)
。如果我们现在致电push_back()
会怎样?对象会立即重新定位吗?如果没有,那么如何保留空间?
是的,重新安置将会发生,但这取决于。如前所述,reserve()
分配足够的内存来存储与传递给它的参数一样多的元素。因此,如果此元素数量大于当前向量reserve()
中可容纳的元素数量,则将进行重定位。
标准参考文献:
C ++ 03 23.2.4.2向量容量[lib.vector.capacity]
capacity()
效果:一种指令,通知向量计划的大小更改,以便相应地管理存储分配。在
void reserve(size_type n);
之后,如果重新分配发生,reserve()
大于或等于保留的参数;并且等于capacity()
的先前值。当且仅当当前容量小于capacity()
的参数时,才会重新分配。复杂性:它不会改变序列的大小,并且最多只需要序列大小的线性时间。
投掷: length_error if
reserve()
。248)注意:重新分配使引用序列中元素的所有引用,指针和迭代器无效。保证在调用
n > max_size()
之后插入期间不会重新分配,直到插入使向量的大小大于最近一次调用reserve()
中指定的大小为止