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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:27:21