我正在尝试使用用户输入的维度在C ++中初始化一个int
矩阵,并将每个元素设置为零。我知道there are some elegant ways to do that with a one-dimensional array,所以我想知道是否有类似的方法可以使用二维数组而不使用for
循环并遍历每个元素。
我发现a source提供了几种不同的方式,包括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] = {{}};
并回答here时),但当我尝试从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.
答案 0 :(得分:0)
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)
的意思是“创建一个 number 的向量,其中每个元素都是 thing 。
答案 1 :(得分:0)
二维数组的第二维必须是编译时间常数,但是在您的代码x
中不是。
实际上,如果您编写带有二维参数的函数,则第二维也必须是编译时间常数。这是因为数组线性存储在内存中,并且编译器必须知道第二维才能正确计算偏移量。