我正在尝试学习如何创建一个正确初始化向量矢量以实现矩阵的类。下面的代码不起作用,在运行构造函数后,向量的大小为0.程序打印0并尝试访问它的元素会导致错误。
代码:
class Matrix{
std::vector<std::vector<int> > Mat;
public:
Matrix(int n, int m);
void set(int a, int b, int Value);
int get(int a, int b);
void size();
};
Matrix::Matrix(int n, int m){
std::vector<std::vector<int> > Mat(n, vector<int>(m));
}
void Matrix::size(){
std::cout << std::endl << Mat.size() << std::endl;
}
int Matrix::get(int a, int b){
return Mat[a][b];
}
void Matrix::set(int a, int b, int Value){
Mat[a][b]=Value;
}
int main(int argc, char** argv) {
Matrix M(10,10);
M.size();
return 0;
}
答案 0 :(得分:2)
此代码:
Matrix::Matrix(int n, int m){
std::vector<std::vector<int> > Mat(n, vector<int>(m));
}
将默认构造成员变量Mat
,然后单独尝试构造与成员无关的局部变量Mat
。要初始化成员变量,您需要使用成员初始化列表:
Matrix::Matrix(int n, int m)
: Mat(n, std::vector<int>(m))
{ }
作为旁注,size()
应该返回大小,而不是打印它,如果你的getter返回了int&
而不是int
,你不需要一个带有代码重复的setter。
答案 1 :(得分:2)
1)当前代码
问题是当你输入构造函数的主体时已经构造了Mat
。你所做的只是重新定义一个本地Mat
,它隐藏了具有相同名称的成员,并在退出构造函数后立即消失。
请改为尝试:
Matrix::Matrix(int n, int m) : Mat(n, vector<int>(m)) {
}
2)有更好的方法吗?
这一切都取决于你打算做什么,是你的约束,还有什么是权衡取舍:
如果矩阵的大小并不总是在编译时定义,那么这种实现相当不错,并且代码非常易读。
如果你有许多相当小的向量,一种替代方法可能是将矩阵的内部表示展平为一维向量。你需要一些向量,但必须计算getter和setter的flatened索引。如果你的Matrix类提供了大量的矩阵运算,会使代码的可读性降低(即Mat[n][m]
对Mat[n*width+m]
)
如果矩阵的大小是在编译时确定的(例如,您只使用2D或3D矩阵),那么使用std::array
而不是std::vector
是有意义的:编译器可以然后利用已知的大小生成更快的代码。
答案 2 :(得分:-1)
在构造函数中,您应该使用以下内容进行初始化
Matrix::Matrix(int n, int m) {
Mat = std::vector<std::vector<int> > (n, std::vector<int>(m));
}
或使用其他答案中提到的方式