向量的reserve()方法的行为

iam*_*ind 6 c++ methods stdvector

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

  1. 假设reserve(N)一个接一个地立即调用多次.早期reserve(N1)会被加起来还是被覆盖?
  2. 如果早期reserve(N1)被最新的呼叫覆盖,那么如果最新reserve(Nn)要求的插槽数量减少会怎样?
  3. 在声明vector我们是否只有push_back()X元素之后,然后我们调用reserve(N).已经有push_back()X元素会被计入N吗?
  4. 假设,如果vector有一些X推送元素,现在如果我们再增加 push_back()1个元素(X + 1),则该对象必须重新定位; 但我们还没有表演push_back().如果我们reserve()现在打电话怎么办?对象会立即重新定位吗?如果没有,那么如何保留空间?

Amb*_*ber 12

reserve()只是确保向量的已分配内存至少足以包含作为其参数传递的项目数.从而...

  1. 所有通过的最大值中的任何一个将是有效保留的最小结果容量.
  2. 见#1.
  3. 是.
  4. reserve()调用时,向量会分配尽可能多的内存,以便存储传递给的项目数reserve().

引用实际标准:

void reserve(size_type n)
Run Code Online (Sandbox Code Playgroud)

如果n小于或等于capacity(),则此调用无效.否则,它是分配额外内存的请求.如果请求成功,则capacity()大于或等于n; 否则,capacity()没有变化.无论哪种情况,size()都没有变化.

  • #1是不准确的:具有_at至少与`reserve()一样多`ask表示结果_capacity_(不是大小!)可能大于对具有最大请求的`reserve()`的调用. (2认同)

Alo*_*ave 5

假设reserve(N)立即被相继调用多次。较早的会reserve(N1)被添加或覆盖吗?

与此不同的std::string是,不可能调用reserve()收缩std::vectorcapacity()使用reserve()小于当前参数的参数调用capacity()是无操作。reserve()因此,增加当前容量的最后一次调用将保持有效。

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

reserve()使用小于当前参数的参数进行调用capacity()是无操作。

声明向量后,如果我们只有push_back() X个元素,然后我们调用reserve(N)。已经 Push_back() X 的元素会计入 N 吗?

reserve()只是分配(保留)足够数量的元素,所以是的。请注意,在调用后,reserve()capacity()更改向量的 ,size()保持不受影响。如果您需要创建尽可能多的元素而不仅仅是保留内存,则应该使用resize()

假设,如果向量有一些X被推送的元素,现在如果我们再添加push_back()1 个元素(X+1),那么该对象将不得不重新定位;但我们还没有表演push_back()。如果我们现在打电话会发生什么reserve()?该对象会立即重新定位吗?如果没有,那么空间是如何保留的?

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

标准参考文献:
C++03 23.2.4.2 向量容量 [lib.vector.capacity]

void reserve(size_type n);

效果:通知向量计划的大小更改的指令,以便它可以相应地管理存储分配。之后reserve()capacity()如果发生重新分配,则大于或等于保留参数;并等于capacity()else 的先前值。当且仅当当前容量小于参数时,此时才会发生重新分配reserve()

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

抛出: length_error 如果n > max_size()0.248)

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