C++初学者求助:如何在自定义Matrix类中初始化二维vector
解决Matrix类二维vector初始化的问题
嘿,作为C++初学者能自己动手写Matrix类真的很棒!我来帮你搞定构造函数里的二维vector初始化问题~
首先先指出你现有代码的两个小问题:
- 循环顺序搞反了:你需要先创建行(对应参数
nb_row),再给每一行填充列(对应nb_col),而不是先列后行; - 循环体里没有实际添加元素的逻辑,这就是你卡壳的核心原因。
下面给你几种实用的解决方案,从基础到简洁写法都有:
方法1:用循环手动初始化(适合理解底层逻辑)
Matrix::Matrix(unsigned int nb_row, unsigned int nb_col) : m_nbRow(nb_row), m_nbCol(nb_col) // 推荐用成员初始化列表,比构造函数体赋值更高效 { // 提前给外层vector预留行的空间,避免多次扩容带来的性能损耗 m_data.reserve(nb_row); for (unsigned int i = 0; i < nb_row; ++i) { // 直接在m_data里构造一行:包含nb_col个long类型的默认值(这里用0L) m_data.emplace_back(nb_col, 0L); // 如果你习惯用push_back,也可以写:m_data.push_back(std::vector<long>(nb_col, 0L)); } }
这里emplace_back比push_back更高效,因为它直接在vector的内存空间里构造子vector,不需要额外的拷贝操作。
方法2:用vector构造函数直接初始化(最简洁)
如果你想少写代码,完全可以利用std::vector的构造函数特性,在成员初始化列表里一步完成所有初始化:
Matrix::Matrix(unsigned int nb_row, unsigned int nb_col) : m_nbRow(nb_row), m_nbCol(nb_col), m_data(nb_row, std::vector<long>(nb_col, 0L)) { // 构造函数体可以完全为空,所有初始化工作都在上面的列表里完成了 }
这个写法的逻辑是:外层m_data被初始化为包含nb_row个元素的vector,每个元素又是一个包含nb_col个0L的std::vector<long>,完美匹配你想要的矩阵结构。
额外小提示
如果你的矩阵需要初始化为非0的默认值,只需要把代码里的0L换成你需要的数值就行,比如初始化为1的话就写1L。
内容的提问来源于stack exchange,提问作者Icetom54
相关产品推荐
相关产品推荐

