向量保留( )方法的行为

Behavior of vector's reserve( ) method

本文关键字:方法 保留 向量      更新时间:2023-10-16

我想知道std::vector::reserve()在以下情况下的行为:

  1. 假设CCD_ 2立即被多次调用。早期的reserve(N1)会被添加或覆盖吗
  2. 如果较早的CCD_ 4被最新的呼叫覆盖,那么如果最新的CCD_ 5需要更少数量的时隙,会发生什么
  3. 在声明CCD_ 6之后,如果我们具有简单的CCD_,然后我们调用CCD_ 8。已经push_back() XN中计数的元素
  4. 假设,如果vector有一些X推动的元素,现在如果push_back()再增加1个元素(X+1),则该对象必须搬迁;但我们还没有执行CCD_ 13。什么如果我们现在调用reserve()会发生什么?物体会被重新定位吗立即如果没有,那么如何保留空间

reserve()只是确保向量分配的内存至少足够大,足以包含作为其参数传递的项目数。因此

  1. 无论通过的所有容量的最大值是哪一个,都将是有效保留的最小容量
  2. 参见#1
  3. 是的
  4. 当调用reserve()时,矢量分配与存储传递给reserve()的项目数所需的内存一样多的内存

引用实际标准:

void reserve(size_type n)

如果n小于或等于capacity(),则此调用无效。否则,它就是一个分配额外内存的请求。如果请求成功,则reserve(N)0大于或等于n;否则capacity()不变。在任何一种情况下,size()都是不变。

假设CCD_ 24立即被多次调用。早期的reserve(N1)会被添加或覆盖吗?

std::string不同,std::vector不可能调用reserve()来收缩capacity()。使用小于当前capacity()的自变量调用reserve()是不可行的。因此,增加当前容量的最后一个CCD_ 32呼叫将保持良好。

如果较早的reserve(N1)被最新的调用覆盖,那么如果最新的reserve(Nn)需要更少的插槽数,会发生什么?

使用小于当前capacity()的参数调用reserve()是否定的。

在声明vector之后,如果我们有简单的push_back()X元素,那么我们调用reserve(N)。已经push_back()的X元素会以N计数吗?

reserve()只是分配(保留)了足够数量的元素,所以是。注意,在调用reserve()之后,仅矢量的capacity()被改变,reserve(N1)0保持不受影响。如果您需要创建尽可能多的元素,而不仅仅是保留内存,那么您应该使用resize()

假设,如果向量有一些X推送的元素,现在如果我们再push_back() 1个元素(X+1),那么该对象将不得不重新定位;但我们还没有执行CCD_ 45。如果我们现在调用reserve()会发生什么?物体会立即被重新定位吗?如果没有,那么如何保留空间?

是的,搬迁会发生,但要视情况而定。如前所述,reserve()分配了足够的内存来存储与传递给它的参数一样多的元素。因此,如果元素的数量大于当前向量capacity()中可以容纳的数量,则会发生重新定位。

标准参考:
C++03 23.2.4.2矢量容量[lib.vvector.C容量]

void reserve(size_type n);

效果:一个指令,通知向量计划的大小更改,以便它可以相应地管理存储分配。在reserve(Nn)0之后,如果发生重新分配,则capacity()大于或等于保留的自变量;否则等于CCD_ 52的先前值。当且仅当当前容量小于reserve()的自变量时,此时才发生重新分配。

复杂性:它不会改变序列的大小,并且最多需要序列大小的线性时间。

投掷:如果n > max_size().248),则为length_error

注意:重新定位将使引用序列中元素的所有引用、指针和迭代器无效。保证在对reserve()的调用之后发生的插入期间不会发生重新分配,直到插入将使向量的大小大于对reserve()的最近调用中指定的大小为止。