使用push_back(x) 还是使用索引(容量)更快?

Abd*_*med 0 c++ vector

我学习了两种将元素插入到vector.

由于我的工作有时间限制,我一直想知道哪种方式更快。

方法一:

int n;
cin>>n;
vector<int> v(n);
for(int i = 0;i<n;i++){
  cin>>v[i];
}
Run Code Online (Sandbox Code Playgroud)

方法二:

int n;
cin>>n;
vector<int> v;
for(int i = 0;i<n;i++){
  int x;
  cin>>x;
  v.push_back(x);
}
Run Code Online (Sandbox Code Playgroud)

如果您有更好的方法推荐,将不胜感激!

Mar*_*ork 7

两者都有问题:
您应该使用reserve(n)

int n;
cin >>  n;
vector<int> v;
v.reserve(n);
for(int i = 0; i < n; ++i){
    int x;
    cin >> x;
    v.emplace_back(x);
}
Run Code Online (Sandbox Code Playgroud)

在第一个版本中:设置大小。

在这里,您遇到了一个问题,即您正在构造数组中的所有元素。现在对于整数来说这可能是微不足道的。但是,如果我们将其扩展到具有需要为每个元素调用的构造函数的非整数类型,那么您将使用赋值运算符来复制它们。

第二个选项:push_back

在这里,您会遇到底层存储被重新分配(可能多次)的风险。每次重新分配时,都需要将数据从旧存储复制到新存储。

同样,这对整数会造成伤害,但对具有构造函数和析构函数的类型确实会造成伤害。

首选: emplace_back()

而不是将其推到需要完全构造的对象的地方。您可以使用 emplace_back 并传入用于构造对象的对象。这使得向量可以就地构建对象。如果您有简单的整数或具有有效移动语义的类,那么这不是问题,但值得作为一般习惯。

  • **首选:reserve + emplace_back()** (3认同)
  • @MooingDuck https://abseil.io/tips/112 建议:*如果`push_back()`和`emplace_back()`都可以使用相同的参数,你应该更喜欢`push_back()`,对于`insert也是如此()` 与 `emplace()`*。 (2认同)