将矩阵中具有可变维数的所有元素初始化为零
Initialize all elements in matrix with variable dimensions to zero
我正在尝试用用户输入的维度在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
不是。
实际上,如果您使用二维参数编写函数,则第二维也必须是编译时常量。这是因为数组线性存储在内存中,编译器必须知道第二维才能正确计算偏移量。
相关文章:
- 用向量的向量元素初始化向量的空向量
- 使用 new 和 值进行数组初始化,但没有显式数量的元素
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- C++ 未初始化的本地(非全局)int 数组中的元素类型到底是什么?
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 如何初始化由unique_ptr管理的数组的元素?
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 使用宏使用额外元素初始化数组
- 为什么数组的 GCC 聚合初始化首先用零填充整个事物,包括非零元素?
- 在 new 关键字中,由默认构造函数初始化的类中的元素是否也使用 new 关键字在C++?
- 用空向量 c++ 的 M 元素初始化向量
- 如何用NaN元素初始化双矩阵?
- 将向量元素与字符串元素进行比较,而不初始化向量
- 使用声明中的元素类型隐式初始化 std::array
- 如何使用初始化列表循环修改元素
- 在 c++ 中使用未知元素初始化的字符数组
- 如何使用给定数量的元素初始化boost::python::list
- 如何使用两点和步骤 c++ 之间的元素初始化向量
- 使用 const 数组元素初始化
- 使用硬编码元素初始化 std::vector 的最简单方法是什么<MyClass>?