使用C++嵌套vector时是否必须指定大小?无大小为何触发段错误?
问题原因
- 当你写
vector<vector<int>> res(size);时,这个构造函数会直接创建包含size个空vector<int>的容器。此时res[0]到res[size-1]都是合法存在的空向量,你可以直接通过下标访问并调用push_back添加元素,不会越界。 - 但如果只写
vector<vector<int>> res;,res一开始是空容器,里面没有任何元素。这时候你用res[u]或res[v]通过下标访问,本质是在访问容器范围外的内存——因为容器当前大小为0,根本不存在对应下标的元素,这种操作属于未定义行为,直接触发段错误。
修复方法
有两种常用的解决思路:
- 提前初始化容器大小(就是你之前能正常运行的写法):
vector<vector<int>> res(size); // 预分配size个空的vector<int>元素 - 如果没法提前确定容器大小,先确保要访问的下标位置存在,再执行push_back:
比如处理res[u].push_back(v)时,可以先检查并扩容:
或者用循环的方式兜底:// 确保res的大小至少能覆盖下标u if (u >= res.size()) { res.resize(u + 1); // 扩容到u+1个元素,新增的都是空vector } res[u].push_back(v);while (res.size() <= u) { res.emplace_back(); // 逐个添加空vector,直到能访问res[u] } res[u].push_back(v);
内容的提问来源于stack exchange,提问作者ullas G
相关产品推荐
相关产品推荐

