在 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<int,n>
。那么有没有什么方法可以在运行时获取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<T>
的二维数组:
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>> 太多,考虑制作 typedeftypedef Matrix std::vector<std::vector<float>>;
或者如果确实需要模板 T template<typename T> using Matrix<T> = std::vector<std::vector<T>>;
@V.Kravchenko,很好的收获。更新。谢谢..以上是关于在 C++ 11 中初始化二维数组有啥好的方法吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章