将尺寸可变的矩阵中的所有元素初始化为零

时间:2019-07-12 22:23:23

标签: c++

我正在尝试使用用户输入的维度在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.

2 个答案:

答案 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中不是。

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