【问题标题】:How to create a 2D vector array with default values?如何创建具有默认值的二维向量数组?
【发布时间】:2017-01-06 16:30:11
【问题描述】:

如何创建 NxM 2D int 向量并为其创建默认值?

这里我尝试用一​​些值创建一个 3x3 int 向量:

vector< vector<int> > m(3, vector<int> (3)) = {
    {1,2,9},
    {8,4,7},
    {5,6,0}
   };

但是这个错误与

> g++ a.cpp -std=c++11

error: expected ‘,’ or ‘;’ before ‘=’ token
     vector< vector<int> > m(3, vector<int> (3)) = {
                                                 ^
error: expected ‘}’ at end of input
 }

我也在使用 c++11,所以上面的语法不应该是正确的吗?按照this answer的说法应该没问题吧?

【问题讨论】:

  • 投票结束是一个错字。摆脱构造函数调用,因为初始化列表取代了它。 vector&lt; vector&lt;int&gt; &gt; m = ...

标签: c++ c++11


【解决方案1】:

如果您删除括号中的内容,它会正常工作。维度由初始化列表的大小决定。如果要自己指定大小,可以使用std::array

std::vector< std::vector<int> > m= {
    {1,2,9},
    {8,4,7},
    {5,6,0}
   };

初始化数组有点不同。见this question。你需要双括号。

#include <array>
std::array< std::array<int, 3>, 3 > m= {{
    {1,2,9},
    {8,4,7},
    {5,6,0}
    }};

【讨论】:

  • 声明二维数组时使用std::arraystd::vector有什么区别?您什么时候会使用其中一种?
  • @vuvume std::array 的大小是在编译时指定的,永远不会改变。 std::vector 的大小可以在运行时改变。
  • @FrançoisAndrieux 不是真的。 std::array 只是 T[] 的包装。它具有相同的聚合初始化。它只是添加了一些便利功能并使传递数组“更容易”。是的,它是一个类类型,但它实际上基本上是替代品或T[]
  • @vuvume:你在用什么书? Stack Overflow cmets 部分不适合学习 C++。
  • @vuvume,空数据容器中有 no 个 null 元素,访问不存在的元素将导致未定义的行为。
【解决方案2】:

括号中的代码为vector的构造函数提供了参数:

vector<vector<int>>(3, vector<int>(3));

这将创建一个包含三个vector 类型元素的新向量,每个元素内部都有三个整数。因此,在这种情况下,向量内没有nulls

这段代码:

vector<vector<int>> test = 
    { {3,4,5},
       {4,5,6} };

使用另一个构造函数,它接受一个初始化列表,并自行推断结果向量的大小。

它们是不同的构造函数! 当你用Type object(arg1, arg2); 表示法构造一个对象时,你基本上是在调用Type 的构造函数。您正在调用函数,当然您不能添加到函数调用中。

【讨论】:

  • 如果我想初始化一个空的 3x3 数组怎么办?我如何访问test[2][2] == null
  • @vuvume: null??停止随机猜测 - 编程不是那样工作的。无论如何,没有空的 3x3 数组这样的东西;数组要么有元素,要么没有。
猜你喜欢
  • 2022-01-07
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多