C++遍历嵌套vector输出随机异常值的原因及正确实现方法
随机异常值的产生原因
问题出在内层循环的遍历边界设置错误。
你的代码中vec是外层长度为4的嵌套vector,其中存储的每一个内层vector<int>长度均为2,但内层循环写为for (int i2 = 0; i2 < vec.size(); i2++),错误地将外层vector的长度4作为内层遍历的终止条件,相当于对每个长度为2的内层vector,都尝试访问索引为2、3的越界位置。
C++中std::vector的[]运算符默认不做边界检查,访问超出容器长度的索引属于未定义行为,会直接读取对应内存位置残留的未知数据,也就是你输出中看到的无规律随机大数。
嵌套vector的正确遍历实现
下面给出两种常用的正确写法,均不会出现越界问题:
- 索引遍历写法
内层循环的终止条件必须设置为当前遍历到的内层vector的长度,修正后的完整代码如下:
#include <iostream> #include <vector> int main(){ std::vector<std::vector<int>> vec = {{0,1},{2,3}}; vec.push_back({4,5}); vec.push_back({5,6}); for (int i = 0; i < vec.size(); i++){ // 注意这里的上界是vec[i].size(),即当前内层vector的长度 for (int i2 = 0; i2 < vec[i].size(); i2++){ std::cout << vec[i][i2] << std::endl; } } return 0; }
运行后会按顺序输出0、1、2、3、4、5、5、6,无异常值。
- 范围for遍历写法(C++11及以上版本支持)
不需要手动管理索引,从语法层面避免边界写错的问题,可读性更高:
#include <iostream> #include <vector> int main(){ std::vector<std::vector<int>> vec = {{0,1},{2,3}}; vec.push_back({4,5}); vec.push_back({5,6}); // 用const引用接收内层vector,避免不必要的拷贝开销 for (const auto& inner_vec : vec){ for (int num : inner_vec){ std::cout << num << std::endl; } } return 0; }
调试小提示:如果需要在开发阶段快速定位越界问题,可以将
[]访问替换为at()方法,比如vec.at(i).at(i2),该方法自带边界检查,越界时会直接抛出std::out_of_range异常,缺点是有少量额外性能开销,不适合性能敏感的正式发布场景。
内容的提问来源于stack exchange,提问作者Felipe Palermo
相关产品推荐
相关产品推荐

