在 C++ 11 中初始化二维数组有啥好的方法吗? [复制]

Posted

技术标签:

【中文标题】在 C++ 11 中初始化二维数组有啥好的方法吗? [复制]【英文标题】:Is there any good method to initialize 2-D array in C++ 11? [duplicate]在 C++ 11 中初始化二维数组有什么好的方法吗? [复制] 【发布时间】:2018-07-10 14:46:56 【问题描述】:

我想用一个二维数组初始化一个单位矩阵(主对角线上的一个,其他地方的零)。 我尝试用vector 来实现它。代码是这样的:

vector<vector<int> > matrix;
matrix.resize(n);
for(auto &i: matrix)
    i.resize(n);

// initialize...

这比仅使用 int matrix[n][n] 的普通数组复杂得多。我不这样做是因为我想返回这个二维矩阵。所以函数是这样的:

matrix_type
func(int n)

  //intialize the matrix
  ...

因为C++11中的数组是这样的:

array<Elem,N> arr;

我不知道如何在运行时获取 N。然后我决定使用向量。

那么有没有更好的方法来处理这个问题?(不使用传统数组)


感谢您的回答。这个问题可以通过使用来解决

vector<vector<int>> matrix(n, std::vector<int>(n));

还有,另一个问题。如果我是个笨蛋,只想使用接口,也就是我希望返回类型为 array&lt;int,n&gt;。那么有没有什么方法可以在运行时获取N并返回呢?

【问题讨论】:

您不能使用二维数组方法的原因是什么?所有这些方法都可以满足您的需求,您更愿意实施哪一种? 普通的int matrix[n][n] 不适用于n unknown 在编译时。 哦,这只是为了好奇。由于 STL 已经定义了一个新的 接口。所以我想知道是否有一个好的方法可以通过只使用 STL 来解决这个问题。 @V.Kravchenko 是的,那不是真的。感谢您指出。然后事情就变得复杂了~~ 请注意,向量的向量是矩阵的低效表示。连续存储的行的平面向量更好。 【参考方案1】:

您可以将矩阵的构造/初始化简化为:

vector<vector<int>> matrix(n, std::vector<int>(n));

以上行会将矩阵的所有元素初始化为 0。您可以使用 for 循环将对角元素的值设置为 1。

for ( size_t i = 0; i < n; ++i )

   matrix[i][i] = 1;

【讨论】:

哦,是的!我忘记了这个!这是一个很好的答案!谢谢~【参考方案2】:

您可以按如下方式初始化std::vector&lt;T&gt; 的二维数组:

 template<typename T>
 using Matrix = std::vector<std::vector<T>>;

 template<typename T>
 Matrix<T> make2DArray(int N, int M)
     return Matrix<T>(N, std::vector<T>(M));
 

这样称呼它:

 auto my2Darr = make2DArray<int>(20, 30);

【讨论】:

此解决方案中的 std::vector<:vector>> 太多,考虑制作 typedef typedef Matrix std::vector&lt;std::vector&lt;float&gt;&gt;; 或者如果确实需要模板 T template&lt;typename T&gt; using Matrix&lt;T&gt; = std::vector&lt;std::vector&lt;T&gt;&gt;; @V.Kravchenko,很好的收获。更新。谢谢..

以上是关于在 C++ 11 中初始化二维数组有啥好的方法吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C++ 这个类和单例的全局声明有啥好的选择吗? [复制]

Windows 中的线程有啥好的初学者教程吗? C++ [关闭]

从事件中返回一个值——这有啥好的做法吗?

不处理 C# 方法的返回值可以吗?这个例子中有啥好的做法?

JDBC DAO - 有啥好的参考实现吗?

js将两个json合并成一个,有啥好的方法