如何在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
相关产品推荐
相关产品推荐

