C++中vector<vector<int>>两种初始化区别及访问段错误问题咨询
段错误触发原因
vector<vector<int>> vec(n) 这类带长度参数的初始化逻辑,是直接生成包含n个空一维vector的二维容器,后续你调用push_back添加元素时,新元素会被追加到这n个空元素的末尾,而非覆盖原有空元素。你访问vec[1][2]时,索引为1的位置还是初始化自带的空vector,没有任何存储元素,访问下标2直接触发数组越界,所以出现段错误。
你之前无参初始化vector<vector<int>> vec时,容器初始为空,每次push_back的元素都会按顺序填充从0开始的下标位置,只要你存入的第二个一维vector(下标1)长度≥3,访问vec[1][2]就不会有问题。
带初始长度写法的正确修改方案
如果要使用vector<vector<int>> vec(n)的初始化方式,不需要额外调用push_back添加外层元素,直接对对应下标的一维vector操作即可,代码修改如下:
int n; cin >> n; // 初始化时已生成n个空一维vector vector<vector<int>> vh(n); int size, input; for (int i = 0; i < n; i++) { cin >> size; for (int j = 0; j < size; j++) { cin >> input; // 直接给第i个一维vector添加元素 vh[i].push_back(input); } }
内容的提问来源于stack exchange,提问作者Bala
相关产品推荐
相关产品推荐

