C++向量排序触发std::out_of_range错误的排查求助
问题分析
数组越界触发异常
你遇到的std::out_of_range错误,根源在SortVector函数的循环逻辑:当循环变量i走到myVec.size()-1(最后一个元素的索引)时,代码尝试访问myVec.at(i+1),这个索引等于myVec.size(),而vector的有效索引范围是0到size()-1,直接越界触发了异常。循环条件必须改成i < myVec.size() - 1,避免触碰最后一个元素的下一个位置。排序逻辑不完整
当前的SortVector只做了一轮相邻元素的交换,根本完成不了完整的从大到小排序。比如你给出的测试用例,跑一轮只能移动部分元素,无法实现全局有序。需要嵌套循环,多跑几轮排序,每轮把最小的元素沉到末尾,逐步缩小需要比较的元素范围。
修正后的代码
#include <iostream> #include <vector> using namespace std; void SortVector(vector<int>& myVec){ int tempNum; // 外层循环控制排序轮数,每轮确定一个最小元素的最终位置 for (int j = 0; j < myVec.size() - 1; ++j) { // 内层循环只比较未排序的元素,每轮减少一个已排序的末尾元素 for (int i = 0; i < myVec.size() - 1 - j; ++i) { if (myVec.at(i) < myVec.at(i+1)) { tempNum = myVec.at(i); myVec.at(i) = myVec.at(i + 1); myVec.at(i + 1) = tempNum; } } } } void print(vector<int>& myVec){ for(int i = 0; i < myVec.size(); ++i){ cout << myVec.at(i) << ", "; } } int main() { int numOfVector; cin >> numOfVector; vector<int> myVec(numOfVector); for(int i = 0; i < numOfVector; ++i){ cin >> myVec.at(i); } SortVector(myVec); print(myVec); return 0; }
测试验证
输入5 10 4 39 12 2时,程序会输出39, 12, 10, 4, 2, ,和你预期的结果一致。
如果不想手动实现排序,也可以直接用标准库的sort函数简化代码,只需添加<algorithm>头文件:
#include <iostream> #include <vector> #include <algorithm> using namespace std; void SortVector(vector<int>& myVec){ // greater<int>() 指定从大到小排序规则 sort(myVec.begin(), myVec.end(), greater<int>()); } // print和main函数保持不变
内容的提问来源于stack exchange,提问作者prolix
相关产品推荐
相关产品推荐

