包含vec vec的类的构造方法

时间:2016-02-18 19:03:59

标签: c++ vector constructor

我正在尝试学习如何创建一个正确初始化向量矢量以实现矩阵的类。下面的代码不起作用,在运行构造函数后,向量的大小为0.程序打印0并尝试访问它的元素会导致错误。

  1. 我的第一个问题是代码有什么问题以及如何修复它。
  2. 我的第二个问题是,是否有更好的方法来创建一个类,以便使用STL中的向量或类似对象动态实现矩阵。
  3. 代码:

    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;
    }
    

3 个答案:

答案 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));
}

或使用其他答案中提到的方式