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

C++如何访问vector of vector元素?代码无报错无输出是什么原因?

问题根因

你代码的核心问题是空vector越界访问触发了未定义行为,具体原因如下:

  • 你声明的vector<vector<int>> v是完全为空的容器,内部没有任何行元素,v.size()为0,此时直接访问v[0]、v[1]已经属于行下标越界。
  • 就算v有行元素,每一行的内层vector同样是空的,直接访问v[0][0]属于列下标越界。
  • C++标准中vector的[]运算符默认不做边界检查,越界访问不会主动抛出异常,属于未定义行为:可能直接崩溃、可能程序异常终止、也可能表面看似正常但逻辑错误,你的场景就是越界访问后程序提前终止,根本没有执行到后续的cout<<2语句,所以不会打印出2。
二维vector(vector of vector)的正确使用方法

1. 先初始化指定大小,再用下标访问

如果提前知道二维数组的行列数,建议初始化时直接指定容量,后续就可以直接用v[i][j]读写元素:

#include <iostream>
#include <vector>
using namespace std;
int main(){
    // 示例:初始化一个5行3列的二维vector,所有元素默认初始化为0
    vector<vector<int>> v(5, vector<int>(3));
    v[0][0] = 1;
    v[1][0] = 1;
    v[1][1] = 1;
    cout << 2;
    return 0;
}

2. 动态扩容用push_back

如果不知道提前行列数,需要动态添加元素,必须用push_back方法新增行/列元素,不能直接访问不存在的下标:

#include <iostream>
#include <vector>
using namespace std;
int main(){
    vector<vector<int>> v;
    // 新增第一行
    v.push_back(vector<int>());
    // 给第一行新增元素
    v[0].push_back(1);
    // 新增第二行
    v.push_back(vector<int>());
    // 给第二行新增两个元素
    v[1].push_back(1);
    v[1].push_back(1);
    cout << 2;
    return 0;
}

3. 安全访问的可选方案

如果担心下标越界难排查,可以用at()方法替代[]运算符,at()会主动做边界检查,越界时直接抛出std::out_of_range异常,方便调试定位问题:

v.at(0).at(0) = 1; // 效果同v[0][0] =1,越界会抛异常

内容的提问来源于stack exchange,提问作者Deepak Silver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:45:03