【问题标题】:initializing a vector of vector<doubles> c++初始化vector<doubles> c++的向量
【发布时间】:2011-09-22 17:52:47
【问题描述】:

您好,我想初始化一个大小为 9 的向量,其元素是大小为 5 的向量。我想将所有元素初始化为零向量。

这种方式正确吗?

vector<double> z(5,0);

vector< vector<double> > diff(9, z);

或者有没有更短的方法可以做到这一点?

【问题讨论】:

  • 这是创建二维向量的正确方法。你只是有点冗长而已。
  • 是的,我事先知道尺寸。只是选择了 9 和 5 作为这个问题的一些随机整数。

标签: c++ vector


【解决方案1】:

您可以在一行中执行此操作:

vector<vector<double> > diff(9, vector<double>(5));

您可能还想考虑使用boost::multi_array 来提高存储和访问效率(它避免了双指针间接)。

【讨论】:

  • 另外,具有跨步访问的 45 个元素的向量也可能就足够了...
  • vector&lt;double&gt;(5) 就足够了。 vector&lt;double&gt;(5, 0) 不是必需的,只要第二个参数是 0
【解决方案2】:

你可以把它全部放在一行中:

vector<vector<double>> diff(9, vector<double>(5));

这避免了未使用的局部变量。

(在 C++11 之前的编译器中,您需要留一个空格,&gt; &gt;。)

【讨论】:

  • 注意语法中的&gt;&gt;。一些编译器要求这些符号之间有一个空格。
  • @R.Martinho Fernandes:在这种情况下,不存在任何符合 C++ 的实现。至少,我不相信有人已经发布了一个完整的 C++11 实现。故意编写无法编译的代码可以很好地表明您对新标准的忠诚,但实际上 C++03 还没有死。也就是说,我相信主要的编译器已经完成了这个特定的功能。
  • @SteveJessop 哦,当然。这就是我使用 :P 笑脸的原因。
  • @R.MartinhoFernandes:是的,这确实有点夸张。对不起。
【解决方案3】:

vector&lt; vector&lt;double&gt; &gt; diff(9, std::vector&lt;double&gt;(5, 0));

但是,在编译时已知大小的特定情况下,您可以使用 C 数组:

double diff[9][5] = { { 0 } };

【讨论】:

    【解决方案4】:

    很确定这会起作用:

    vector< vector<double> > diff(9, vector<double>(5,0));
    

    【讨论】:

      【解决方案5】:

      如果尺寸是固定的,您可以改用std::array

      std::array<std::array<double,5>,9> diff = {};
      

      【讨论】:

      • 它还取决于范围的大小。 std::array 将所有内容都保留在本地范围内,因此如果该数组太大,您可能会触发一些名称无法理解的错误。
      猜你喜欢
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 2012-06-21
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多