如何用push_back实现可变行数固定列数的二维std::vector并访问列
实现行数可变、列数固定的二维vector方案
核心思路
保持每一行的vector固定为2列,仅通过push_back动态添加行,访问逻辑和固定行数时一致——关键是确保每次新增的行符合列数要求。
正确实现步骤
- 初始化二维vector
不需要预先指定行数,直接声明空的二维vector即可:
std::vector<std::vector<int>> test;
- 动态添加行并赋值
每次新增行时,构造一个大小为2的vector(可初始化为0或直接接收输入),再通过push_back加入二维vector:
// 方式1:先构造行再赋值 std::vector<int> new_row(2); // 初始化两个元素为0 std::cin >> new_row[0] >> new_row[1]; test.push_back(new_row); // 方式2:直接在push_back中构造行,再赋值 test.push_back(std::vector<int>(2)); // 新增一行,两个元素默认初始化 int last_row_idx = test.size() - 1; // 获取刚新增行的索引 std::cin >> test[last_row_idx][0] >> test[last_row_idx][1];
- 访问指定列
只要每行的vector大小为2,使用[]或at()访问都是有效的(at()会做越界检查并抛出异常;[]不做检查但效率稍高):
// 遍历所有行,输出每列数据 for (int i = 0; i < test.size(); ++i) { // 用[]访问 std::cout << "第" << i+1 << "行:" << test[i][0] << ", " << test[i][1] << std::endl; // 用at()访问(适合需要越界检查的场景) // std::cout << "第" << i+1 << "行:" << test.at(i).at(0) << ", " << test.at(i).at(1) << std::endl; }
常见问题排查
你之前尝试test.at(i).at(0)无效,大概率是因为新增行时没有构造大小为2的vector(比如push_back了空vector),导致访问索引0时触发越界异常。只要确保每次push_back的行是大小为2的vector,两种访问方式都能正常工作。
内容的提问来源于stack exchange,提问作者excellent
相关产品推荐
相关产品推荐

