在push_back()之前保留非空std :: vector的正确方法

时间:2019-07-11 15:52:45

标签: c++

我很困惑N中的vector::reserve(N)是期​​望在当前向量大小或向量的总空间之上添加的元素数。

例如,

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> foo;

    foo.reserve(3);
    foo.push_back(1);
    foo.push_back(2);
    foo.push_back(3);

    foo.reserve(foo.size() + 2);// Should this be foo.reserve(2)?
    foo.push_back(4);
    foo.push_back(5);
}

foo.reserve(foo.size() + 2)应该只是foo.reserve(2)吗?

3 个答案:

答案 0 :(得分:5)

  

将向量的容量增加到大于或等于new_cap的值。如果new_cap大于当前的Capacity(),则分配新的存储,否则该方法不执行任何操作。

从文档here中可以明显看出,这是总大小。

答案 1 :(得分:2)

您应该致电git add .,请参阅[vector.capacity](强调是我的):

  

效果:该指令将向量的计划大小更改通知向量,以便可以相应地管理存储分配。   foo.reserve(foo.size() + 2)之后,如果发生重新分配,则reserve()大于或等于capacity()的参数; ,否则等于reserve的先前值。   当且仅当当前容量小于capacity()的自变量时,才发生重新分配。   如果不是由非 Cpp17CopyInsertable 类型的move构造函数引发异常,则没有任何效果。

答案 2 :(得分:2)

自变量必须为foo.size() + 2。引用cppreference

  

[{reserve将]将向量的容量增加到大于或等于 new_cap 的值。