gpt4 book ai didi

c++ - 包含一个 vec 的类的构造函数

转载 作者:太空狗 更新时间:2023-10-29 21:16:18 25 4
gpt4 key购买 nike

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

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

代码:

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

最佳答案

1) 当前代码

问题是当您进入构造函数的主体时,Mat 已经构造好了。您所做的只是重新定义一个本地 Mat,它隐藏具有相同名称的成员,并在您退出构造函数后立即消失。

试试这个:

Matrix::Matrix(int n, int m) : Mat(n, vector<int>(m)) {
}

2)有没有更好的方法?

这完全取决于您打算做什么、您的约束是什么以及权衡取舍是什么:

  • 如果你的矩阵的大小并不总是在编译时定义,这种实现是相当不错的,并且代码可读性很好。

  • 如果您有许多相当小的 vector ,一种替代方法是将矩阵的内部表示展平为一维 vector 。您会保留一些 vector ,但必须计算 getter 和 setter 的扁平索引。如果您的 Matrix 类将提供大量矩阵运算,则会降低代码的可读性(即 Mat[n][m]Mat[n*width+m])

  • 如果矩阵的大小是在编译时确定的(例如,您只使用 2D 或 3D 矩阵),则使用 std::array 而不是 可能更有意义std::vector:编译器随后可以利用已知的大小来生成更快的代码。

关于c++ - 包含一个 vec 的类的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35490242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com