将矩阵中具有可变维数的所有元素初始化为零

Initialize all elements in matrix with variable dimensions to zero

本文关键字:元素 初始化      更新时间:2023-10-16

我正在尝试用用户输入的维度在C++中初始化一个int矩阵,每个元素都设置为零。我知道有一些优雅的方法可以用一维数组做到这一点,所以我想知道是否有任何类似的方法可以在不使用for循环和遍历每个元素的情况下使用二维数组来做到这一点。

我找到了一个提供了几种不同方式的来源,包括std::fill(我修改了代码,以便用cin读取维度):

#include <iostream>
using namespace std;
int main() {
int x;
cin >> x;
int matrix[x][x];
fill(*matrix, *matrix + x * 3, 0);
for (int i = 0; i < x; i++) {
for (int j = 0; j < 3; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
}

但是为什么这会起作用,如果一维数组不需要,为什么在参数中指向fill矩阵的指针是必需的?该消息人士说,这是因为C++中的矩阵被视为一维数组,这是有道理的,但这就是为什么我不明白为什么需要指针。


我不知道这是否相关,但为了以防万一可以提供帮助,我在下面描述了我以前的尝试。

起初,我认为我可以像在一维数组中一样将所有元素初始化为零。对于矩阵,当边长没有用cin读取时(即当我将矩阵声明为int matrix[3][3] = {{}};时,这工作正常,但当我尝试从cin获取边长时,我开始出现错误。

这是我的代码:

#include <iostream>
using namespace std;
int main() {
int x;
cin >> x;
int matrix[x][x] = {{}};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
}

当我尝试编译它时,它抛出了这个错误:

matrix_test.cpp:7:14: error: variable-sized object may not be initialized
int matrix[x][x] = {{}};
^
1 error generated.

为什么会出现错误

C 样式数组(如int matrix[3][3])必须在声明它时指定大小。它们的大小不能在C++上变化。

你可以做什么。

如果你使用std::vector,有一种非常优雅的方法可以做到这一点:

#include <vector>
#include <iostream>
int main() {
using namespace std; 
int x;
cin >> x;
auto matrix = vector<vector<int>>(x, vector<int>(x, 0)); 
// This is how we can print it
for(auto& row : matrix) {
for(auto& elem : row) {
cout << elem << ' '; 
}
cout << 'n'; 
}
}

在 C++17 中,您可以进一步缩短此时间:

auto matrix = vector(x, vector(x, 0)); 

vector(number, thing)的意思是"创建一个数字向量,其中每个元素都是事物"。

二维数组的第二维必须是编译时常量,但在代码中x不是。

实际上,如果您使用二维参数编写函数,则第二维也必须是编译时常量。这是因为数组线性存储在内存中,编译器必须知道第二维才能正确计算偏移量。