【问题标题】:Elegant way to push back std::array to std::vector N times将 std::array 推回 std::vector N 次的优雅方法
【发布时间】:2018-09-19 08:56:19
【问题描述】:

以下代码将 std::array 推回 std::vector N 次。有没有更优雅和更短的方法来做到这一点?

#include <iostream>
#include <vector>
#include <array>

#include <iomanip>
#include <complex>
#include <cmath>

int main () {
  int N=10;
  std::vector< std::array<std::complex<double>,3> > v;
  v.reserve(N);
  for(int i=0;i<N;i++){
    std::array<std::complex<double>,3> el { {0.0,3.0,0.0} };
    v.push_back(el);
  }
}

【问题讨论】:

  • 你的数组是固定的吗?
  • 在你的简单情况下,如果完全是这种情况,则不需要推送,只需初始化它:coliru.stacked-crooked.com/a/074dc1039efb7613
  • @kiranBiradar 是的
  • @user1810087 在这个简单的例子中你是对的。但在我的代码中,向量是一个类的成员。当我创建一个对象时,我必须指定向量的大小。这就是我使用 v.reserve() 的原因
  • @JanSE 您可能应该在问题中提及这一点。就像现在一样,为什么您当前示例的更好答案不是被接受的答案令人困惑。

标签: c++ vector push-back


【解决方案1】:

是的,但是在构造向量时必须使用括号

std::vector< std::array<std::complex<double>,3> > v(n, {0.0,3.0,0.0});

如果使用大括号而不是初始化列表,那么您可能会遇到意外错误。

【讨论】:

  • 我认为统一初始化纯属失败,因此建议 always 无论如何都使用括号 - 即使在初始化列表 (std::vector&lt;int&gt; v({1, 2, 3});) 的情况下,以保持一致性...跨度>
【解决方案2】:

您可以使用std::vector::insert(重载集中的#3)成员函数:

int N=10;
std::vector< std::array<std::complex<double>,3> > v;
v.reserve(N);

v.insert(v.end(), N,  { {0.0,3.0,0.0} });

请注意,@MarekR 的答案更适合初始化向量,因为它绕过了对 reserve 的调用,并且在初始化期间设置对象通常比后续的成员函数调用更好。上面对std::vector::insert 的调用适用于稍后添加其他元素。

【讨论】:

  • 虽然 Marek 的回答在构造上可能更可取,但这个回答非常适合在以后的某个时间点添加 additional 元素!
猜你喜欢
  • 2020-05-21
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 2018-05-25
  • 2011-05-02
相关资源
最近更新 更多