如何将Cells类对象存入二维std::vector?C++技术问题
解决二维std::vector存入Cells对象的问题
兄弟,我太懂这种踩坑的感觉了!你现在的问题核心是二维vector根本没初始化就直接去访问元素——你声明的std::vector<std::vector<Cells>> cells;是个完全空的容器,既没有任何行,每行里也没有任何元素,直接写cells[i][j] = contentOftheCell;必然会触发越界错误,属于未定义行为。
而你用普通vector能成,应该是因为你会先push_back元素,而二维vector需要先构建行,再给每行添加元素。下面给你两种靠谱的解决方案:
方案1:提前初始化二维vector的大小(适合Cells有默认构造函数的情况)
先把整个二维vector的行和列都分配好空间,之后直接赋值就行:
Calculation::Calculation() { // 一次性初始化size行,每行有size个默认构造的Cells对象 std::vector<std::vector<Cells>> cells(size, std::vector<Cells>(size)); for(unsigned long i = 0; i < size; i++){ for(unsigned long j = 0; j < size; j++){ Cells contentOftheCell(matrixPotential, deltaMatrixPotential); cells[i][j] = contentOftheCell; } } }
方案2:逐行构建+原地构造(更高效,适合无默认构造函数的情况)
用emplace_back直接在容器内部构造Cells对象,避免额外的拷贝,同时通过reserve提前预留空间提升性能:
Calculation::Calculation() { std::vector<std::vector<Cells>> cells; cells.reserve(size); // 提前预留size行的空间,减少扩容开销 for(unsigned long i = 0; i < size; i++){ std::vector<Cells> row; row.reserve(size); // 给每行预留元素空间 for(unsigned long j = 0; j < size; j++){ // 直接在row里构造Cells对象,不用先创建临时对象再赋值 row.emplace_back(matrixPotential, deltaMatrixPotential); } cells.push_back(std::move(row)); // 用移动语义转移row的所有权,避免拷贝整个行 } }
额外说明:
如果你的Cells类没有默认构造函数(就像现在只定义了带两个参数的构造函数),那方案1里的std::vector<Cells>(size)会编译失败,因为它需要默认构造函数来创建初始元素。这时候方案2就是最佳选择,emplace_back会直接调用你定义的带参数的构造函数。
内容的提问来源于stack exchange,提问作者Kang_HM
相关产品推荐
相关产品推荐

