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

C++中排序tasks结构体vector时程序崩溃问题求助

问题排查与解决方案

我帮你找出了代码里导致崩溃的几个关键问题,咱们一步步拆解:

核心问题分析

  1. 迭代器越界访问
    你代码里的auto j = i++;是个致命错误:后置递增i++会先返回当前的迭代器给j,然后把i移动到下一个元素。而你的for循环本身还有i++的操作,相当于每次循环i会前进两次!当vector里有2个及以上元素时,很快i就会超过tasks_list.end(),这时候访问i->task_priority就会触发未定义行为(直接崩溃)。

  2. 无效的条件判断
    if(counter < tasks_list.size())这个判断完全多余,counter从0开始每次加1,而for循环的次数刚好是vector的元素数量,counter永远不会等于或超过tasks_list.size(),这个条件起不到任何作用,反而干扰了逻辑。

  3. 冒泡排序逻辑缺陷
    你的冒泡排序没有控制内层循环的范围,正常来说冒泡排序每一轮只需要比较到倒数第二个元素(因为要和下一个元素对比),而你的循环让i遍历到end(),尾迭代器是不能访问成员的,这也是崩溃的诱因之一。

解决方案

最优方案:使用标准库std::sort

手写排序很容易踩坑,C++标准库的std::sort高效且可靠,完全满足你的需求:

#include <algorithm> // 必须包含这个头文件

void sort_tasks(std::vector<tasks> &tasks_list) {
    // 按优先级降序排序,如果需要升序,把>改成<即可
    std::sort(tasks_list.begin(), tasks_list.end(),
        [](const tasks& task_a, const tasks& task_b) {
            return task_a.task_priority > task_b.task_priority;
        });
}

修正后的手写冒泡排序

如果你坚持要自己实现冒泡排序,这里是修正后的代码:

#include <iterator> // 用于std::prev和std::next

void sort_tasks(std::vector<tasks> &tasks_list) {
    if(tasks_list.empty()) return;

    bool swapped;
    do {
        swapped = false;
        // 内层循环只到倒数第二个元素,确保有下一个元素可以比较
        for(auto i = tasks_list.begin(); i != std::prev(tasks_list.end()); ++i) {
            auto next_task = std::next(i);
            // 这里是升序排序,降序则改为i->task_priority > next_task->task_priority
            if(i->task_priority < next_task->task_priority) {
                std::swap(*i, *next_task); // 用标准库交换函数更安全
                swapped = true;
            }
        }
    } while(swapped);
}

修正点说明

  • 移除了多余的counter变量和无效判断
  • 用std::prev(tasks_list.end())限制内层循环终点,避免迭代器越界
  • 用std::next(i)获取相邻的下一个迭代器,避免手动递增出错
  • 改用std::swap交换元素,代码更简洁且不易出错
  • 修正了交换标记swapped的逻辑,确保只有发生交换时才继续循环

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:32:52