You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:17:43