C++中如何以赋值而非初始化方式创建vector<vector<double>>矩阵?
嘿,针对你想以赋值而非初始化方式创建Matrix对象的需求,我给你整理了几个实用的方案,都是基于C++的常规操作,适配你现有的类结构:
方案1:添加默认构造函数 + 利用赋值运算符
这是最直接的方式,先给你的Matrix类加一个默认构造函数,这样就能先声明一个空的Matrix对象,之后再把新构造的全零矩阵赋值给它。
首先修改你的Matrix类:
#include <vector> using namespace std; class Matrix { private: vector<vector<double>> data; public: // 你已有的构造函数:生成指定维度的全零矩阵 Matrix(int rows, int cols) : data(rows, vector<double>(cols, 0.0)) {} // 添加默认构造函数:可以用编译器生成的默认版本,或者手动初始化空的data Matrix() = default; // 或者手动实现:Matrix() : data() {} // 可选:自定义赋值运算符(如果编译器生成的默认赋值逻辑满足需求,这步可以省略) Matrix& operator=(const Matrix& other) { if (this != &other) { data = other.data; // 直接复用vector的赋值逻辑 } return *this; } // 可选:添加移动赋值运算符,提升临时对象赋值的性能 Matrix& operator=(Matrix&& other) noexcept { if (this != &other) { data = move(other.data); } return *this; } };
然后使用的时候就可以这样(先声明,再赋值):
// 先声明一个默认构造的Matrix对象 Matrix myMatrix; // 赋值一个新的3行4列全零矩阵 myMatrix = Matrix(3, 4);
方案2:用std::optional间接实现(无需修改类的构造)
如果不想给Matrix类加默认构造函数,可以用std::optional来先占位,之后再赋值创建好的矩阵。这种方式适合严格不想修改类结构的场景:
#include <optional> #include <vector> class Matrix { private: vector<vector<double>> data; public: Matrix(int rows, int cols) : data(rows, vector<double>(cols, 0.0)) {} }; // 使用示例 int main() { // 先声明一个optional对象,初始为空 optional<Matrix> myMatrix; // 赋值一个新的2行2列全零矩阵 myMatrix = Matrix(2, 2); // 使用的时候需要解引用,比如调用类的成员方法: // myMatrix->someMethod(); // 或者获取值:Matrix& mat = myMatrix.value(); return 0; }
方案3:添加静态工厂方法(配合赋值)
你也可以给Matrix类加一个静态工厂方法,用来生成全零矩阵,之后通过赋值给已声明的对象(同样需要默认构造函数):
class Matrix { private: vector<vector<double>> data; public: Matrix(int rows, int cols) : data(rows, vector<double>(cols, 0.0)) {} Matrix() = default; // 静态工厂方法,返回指定维度的全零矩阵 static Matrix zero(int rows, int cols) { return Matrix(rows, cols); } }; // 使用示例 Matrix myMatrix; myMatrix = Matrix::zero(5, 5);
额外拓展:赋值非全零矩阵数据
如果你的需求不止于全零矩阵,还想直接赋值自定义的二维数据,可以给类重载operator=来接受vector<vector<double>>类型:
Matrix& operator=(const vector<vector<double>>& vec) { data = vec; return *this; } // 这样就能直接赋值: Matrix myMatrix; myMatrix = {{1.0,2.0}, {3.0,4.0}};
内容的提问来源于stack exchange,提问作者Carlo
相关产品推荐
相关产品推荐

