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

C++向量排序触发std::out_of_range错误的排查求助

问题分析

  1. 数组越界触发异常
    你遇到的std::out_of_range错误,根源在SortVector函数的循环逻辑:当循环变量i走到myVec.size()-1(最后一个元素的索引)时,代码尝试访问myVec.at(i+1),这个索引等于myVec.size(),而vector的有效索引范围是0到size()-1,直接越界触发了异常。循环条件必须改成i < myVec.size() - 1,避免触碰最后一个元素的下一个位置。

  2. 排序逻辑不完整
    当前的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:25:46