我是一个高中生,学习编程,我有一个问题,我不知道如何解决。
我有一个整数"x",我想要一个矩阵"mat“的大小为"x":
int mat[x][x];但这只适用于我读过x的x;
例如,如果是x == 5,则等效为
int mat[5][5];
#include <iostream>
using namespace std;
int x;
int mat[x][x];
void f(int mat2[x][x])
{
}
int main()
{
cin >> x;
int m[x][x];
f(m);
}我写了这个简短的程序来说明它在哪里工作,它不起作用。
错误:数组绑定不是
']'令牌之前的整数常数
函数void f中的全局声明和声明都有错误。它只编译没有错误的main();
我能做些什么来创建一个x大小在主函数之外的矩阵呢?
发布于 2017-03-06 14:06:59
可变长度数组不是在标准c++中扩展的。而且你不想要全局定义。
在这种情况下,您可以使用的是std::vector。
void f(std::vector<std::vector<int>>& mat)
{
}
int main()
{
cin >> x;
std::vector<std::vector<int>> m(x,std::vector<int>(x));
f(m);
}如果将该向量传递给函数或在函数中分配,大小信息将随时保留。
我能做些什么来创建一个在主函数之外大小为x的矩阵?
就像这样:
std::vector<std::vector<int>> foo() {
cin >> x;
std::vector<std::vector<int>> m(x,std::vector<int>(x));
return m;
}
int main()
{
std::vector<std::vector<int>> mat = foo();
}发布于 2017-03-06 14:24:28
在C++中处理多维数组并不容易.最好的方法通常是用线性内存块映射多维索引。
例如,对于2×2矩阵,可以创建一个2*2=4元素数组,并以这样的方式映射它:
+-----------+-----------+-----------+-----------+
| map[0][0] | map[0][1] | map[1][0] | map[1][1] |
+-----------+-----------+-----------+-----------+乍一看,这似乎过于复杂,但它大大简化了内存分配。
对于width任意大小的height矩阵,map[i][j]位于索引i*height + j。这可以在C++中翻译,封装在模板类Matrix中。
#include <array>
template <typename T, size_t WIDTH, size_t HEIGHT>
class Matrix {
std::array<T, WIDTH*HEIGHT> data;
public:
T& operator()(size_t i, size_t j) {
return data[i*HEIGHT + j];
}
const T& operator()(size_t i, size_t j) const {
return data[i*HEIGHT + j];
}
};这有一个缺点,即Matrix的维度必须在编译时就知道(并且可以减轻,请参阅答案末尾的注意(ii) )。但它使它的使用变得如此容易:
void fill(Matrix<int, 2, 2>& m) {
m(0,0) = 0;
m(0,1) = 1;
m(1,0) = 2;
m(1,1) = 3;
}
int main() {
Matrix<int, 2, 2> m;
fill(m);
std::cout << m(1,0) << "\n";
}注意(i):元素是由(line, column)而不是[line][column]索引的,因为我们不能创建接受多个值的operator[]。
住在coliru
注(ii):这个基本思想是可以被丰富(演示)来处理可调整大小的矩阵,使用std::vector而不是std::array和std::vector::resize()的代理。
发布于 2017-03-06 14:22:56
某些编译器支持可变长度数组作为扩展。编译器的手册提供了更多信息。Gnu VLR。
变量长度数组的存储时间(如果支持的话)通常不能是静态的,这就是为什么您得到了错误消息(全局变量具有静态存储持续时间)。
无关:不需要参数mat2的主要数组界,即void f(int mat2[x][x])等效于void f(int mat2[][x])。
https://stackoverflow.com/questions/42627414
复制相似问题