C++ 向量'的行为;s reserve()方法

C++ 向量'的行为;s reserve()方法,c++,methods,stdvector,C++,Methods,Stdvector,我想知道std::vector::reserve()在以下情况下的行为: 假设reserve(N)立即被多次调用。 较早的保留(N1)是否会被累加或覆盖 如果先前的reserve(N1)被最近的调用覆盖, 那么,如果最新的保留(Nn)所需的插槽数较少,会发生什么情况 在声明vector之后,如果我们只有push_back()X元素, 然后我们调用reserve(N)。已经的按钮是否会向后推()X 在N中计数的元素 假设,如果向量有一些X推动元素,现在如果我们 push_back()1个元素(X+

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

  • 假设
    reserve(N)
    立即被多次调用。 较早的
    保留(N1)
    是否会被累加或覆盖
  • 如果先前的
    reserve(N1)
    被最近的调用覆盖, 那么,如果最新的
    保留(Nn)
    所需的插槽数较少,会发生什么情况
  • 在声明
    vector
    之后,如果我们只有
    push_back()
    X元素, 然后我们调用
    reserve(N)
    。已经
    的按钮是否会向后推()
    X 在
    N
    中计数的元素
  • 假设,如果
    向量
    有一些X推动元素,现在如果我们
    push_back()
    1个元素(X+1),则该对象必须 搬迁;但是我们还没有执行
    push\u back()
    。什么 如果我们现在调用
    reserve()
    会发生什么?对象会被重新定位吗 马上?如果没有,那么如何保留空间
  • reserve()。因此

  • 所有通过的最大值将是有效保留的最小结果容量
  • 见#1
  • 调用
    reserve()
    时,该向量分配存储传递给
    reserve()
    的项目数所需的内存

  • 引用实际标准:

    void reserve(size_type n)
    
    如果
    n
    小于或等于
    容量()
    ,则此调用无效。 否则,它将请求分配额外内存。如果 请求成功,则
    capacity()
    大于或等于
    n
    ; 否则,
    capacity()
    将保持不变。在任何一种情况下,
    size()
    都是 不变

    假设
    reserve(N)
    立即被多次调用。较早的
    保留(N1)
    是否会被累加或覆盖

    std::string
    不同,无法为
    std::vector
    调用
    reserve()
    来收缩
    capacity()
    。使用小于当前
    capacity()
    的参数调用
    reserve()
    是不可操作的。因此最后一个
    reserve()
    增加当前容量的呼叫将保持正常

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

    使用小于当前
    容量()的参数调用
    reserve()
    ,是不允许的

    在声明向量之后,如果我们只需要push_back()X元素,那么我们就调用reserve(N)。是否已将_back()X元素按N计

    reserve()。请注意,在调用
    reserve()
    后,只有向量的
    容量()
    被更改,
    size()
    保持不变。如果需要创建尽可能多的元素,而不仅仅是保留内存,则应使用
    resize()

    假设,如果向量有一些
    X
    被推的元素,现在如果我们
    push_back()
    1个元素
    (X+1)
    ,那么该对象必须重新定位;但是我们还没有执行
    push\u back()
    。如果我们现在调用
    reserve()
    会发生什么?对象是否会立即重新定位?如果没有,那么如何保留空间

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

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

    void reserve(大小\u类型n)

    效果:一种指令,用于通知向量计划的大小更改,以便它能够相应地管理存储分配。在
    reserve()
    之后,
    capacity()
    如果发生再分配,则大于或等于reserve的参数;否则等于前面的
    capacity()
    值。当且仅当当前容量小于
    reserve()
    的参数时,此时才会发生重新分配

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

    抛出:如果
    n>max\u size()
    .248),则抛出长度错误

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


    如果您手头没有标准的副本,则可以在线查看。+1同样重要的是,如果发生重新分配(
    n
    capacity()
    );迭代器、指针和对该向量的引用将无效。考虑到这一点,
    reserve()
    在调用
    push_back()
    时,在实际防止重新分配(从而防止迭代器无效等)方面特别有用。#1是不准确的:至少有
    reserve()
    请求的数量意味着生成的容量(而不是大小!)可能大于对
    reserve()的调用
    请求最大。编辑“结果大小”->“最小结果大小”。问题不是“最小”。你在说话