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

如何在C++中构建行列数未知的可动态填充二维容器

动态二维容器的C++实现方案

错误原因分析

你当前代码触发段错误的核心原因是:初始化外层vector时指定了仅包含1行(csv(1, ...)),但后续直接访问csv[1]——这属于越界访问,外层容器此时只有索引0的元素,访问索引1会触及未分配的内存,直接导致崩溃。

正确实现方式

要构建支持动态行列的二维容器,核心是利用std::vector的动态扩容特性,无需预先指定行列数,而是在需要时动态添加行或列:

步骤1:初始化空的二维容器

直接创建空的外层vector,内层也保持空状态,不需要预设任何大小:

std::vector<std::vector<BaseColumn*>> csv;

步骤2:动态添加行

当需要新增一行时,向外层vector中push_back一个空的内层vector即可:

// 添加第一行
csv.push_back(std::vector<BaseColumn*>());
// 添加第二行
csv.push_back(std::vector<BaseColumn*>());

步骤3:向指定行添加元素

对已存在的行(确保索引对应的行已经通过push_back创建),直接用下标访问并push_back元素:

std::string test = "d";
Column<std::string>* tmpString = new Column<std::string>(Types::string, test);

// 向第0行添加元素
csv[0].push_back(tmpString);
csv[0].push_back(tmpString);
csv[0].push_back(tmpString);

// 向第1行添加元素(此时第1行已创建,不会触发越界)
csv[1].push_back(tmpString);
csv[1].push_back(tmpString);
csv[1].push_back(tmpString);
csv[1].push_back(tmpString);

优化建议:避免内存泄漏

你当前使用原始指针,需要手动管理内存释放,容易出现泄漏问题。更安全的方式是使用智能指针(如std::unique_ptr),让容器自动管理内存生命周期:

// 使用unique_ptr的版本
std::vector<std::vector<std::unique_ptr<BaseColumn>>> csv;

// 添加行和元素
csv.push_back(std::vector<std::unique_ptr<BaseColumn>>());
csv[0].emplace_back(std::make_unique<Column<std::string>>(Types::string, test));

完整示例代码

#include <vector>
#include <memory>

// 假设BaseColumn和Column的定义如下
enum class Types { string };
class BaseColumn {};
template<typename T>
class Column : public BaseColumn {
public:
    Column(Types type, const T& val) : type_(type), val_(val) {}
private:
    Types type_;
    T val_;
};

int main() {
    std::vector<std::vector<std::unique_ptr<BaseColumn>>> csv;

    std::string test = "d";

    // 添加第一行并填充元素
    csv.push_back({});
    csv[0].emplace_back(std::make_unique<Column<std::string>>(Types::string, test));
    csv[0].emplace_back(std::make_unique<Column<std::string>>(Types::string, test));
    csv[0].emplace_back(std::make_unique<Column<std::string>>(Types::string, test));

    // 添加第二行并填充元素
    csv.push_back({});
    csv[1].emplace_back(std::make_unique<Column<std::string>>(Types::string, test));
    csv[1].emplace_back(std::make_unique<Column<std::string>>(Types::string, test));
    csv[1].emplace_back(std::make_unique<Column<std::string>>(Types::string, test));
    csv[1].emplace_back(std::make_unique<Column<std::string>>(Types::string, test));

    return 0;
}

内容的提问来源于stack exchange,提问作者user63898

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:30:43