C++遍历数组按条件存元素到vector时触发std::out_of_range报错求解
C++成绩分类程序越界错误修复
错误原因
你碰到的std::out_of_range越界崩溃和你贴的报错信息完全匹配,核心由3个逻辑问题导致:
- 声明的
passingGrades、failingGrades初始是空vector,长度为0。你直接用.at(x)访问指定下标位置,但空vector没有任何可访问的下标,哪怕访问下标0都会触发越界检查抛出错误 - 写了完全无用的内层for循环:循环变量y全程没有被使用,加了break之后内层循环只会跑一次,属于冗余代码
- 下标逻辑错误:两个分类vector的长度是动态变化的(取决于及格/不及格的人数),你用原成绩数组的下标x去访问分类vector的位置,逻辑上就不成立——比如6个成绩里只有2个及格,
passingGrades长度只有2,不可能访问到下标2及以上的位置。
修复方案
- 删除无用的内层嵌套循环
- 不要用下标赋值的方式给空vector加元素,改用
push_back()方法往vector末尾追加元素,该方法会自动扩容,不会触发越界 - 调整打印逻辑,保证及格、不及格成绩分两行输出,同时修正末尾多余逗号的格式问题
修复后的完整可运行代码如下:
#include <iostream> #include <vector> using namespace std; int main() { int userGrades[6]; vector<int> passingGrades; vector<int> failingGrades; // 接收6个成绩输入 for (int i = 0; i < 6; i++) { cout << "Enter the grades of Student " << i+1 << ": "; cin >> userGrades[i]; } // 按规则分类存入对应vector for (int x = 0; x < 6; x++) { if (userGrades[x] >= 60) { passingGrades.push_back(userGrades[x]); } else { failingGrades.push_back(userGrades[x]); } } // 单独一行打印及格成绩 cout << "The passing grades are: "; for (int a = 0; a < passingGrades.size(); a++) { cout << passingGrades[a]; // 最后一个成绩后不打印多余逗号 if (a != passingGrades.size() - 1) { cout << ", "; } } // 换行后单独一行打印不及格成绩 cout << endl << "The failing grades are: "; for (int b = 0; b < failingGrades.size(); b++) { cout << failingGrades[b]; if (b != failingGrades.size() - 1) { cout << ", "; } } cout << endl; return 0; }
额外说明
- 原代码片段缺失必要的头文件引用和main函数结构,修复代码已经补全,可以直接编译运行
- 不需要提前计算vector长度存到单独变量里,循环判断条件直接调用
.size()即可,避免后续代码修改时出现变量值和实际vector长度不一致的问题 vector的.at()方法会做下标越界检查,访问非法位置时会抛出你看到的异常;如果用[]下标运算符访问越界位置不会抛出异常,但会触发内存非法访问的未定义行为,写代码时要注意
内容的提问来源于stack exchange,提问作者tanisha
相关产品推荐
相关产品推荐

