C++中排序tasks结构体vector时程序崩溃问题求助
问题排查与解决方案
我帮你找出了代码里导致崩溃的几个关键问题,咱们一步步拆解:
核心问题分析
迭代器越界访问
你代码里的auto j = i++;是个致命错误:后置递增i++会先返回当前的迭代器给j,然后把i移动到下一个元素。而你的for循环本身还有i++的操作,相当于每次循环i会前进两次!当vector里有2个及以上元素时,很快i就会超过tasks_list.end(),这时候访问i->task_priority就会触发未定义行为(直接崩溃)。无效的条件判断
if(counter < tasks_list.size())这个判断完全多余,counter从0开始每次加1,而for循环的次数刚好是vector的元素数量,counter永远不会等于或超过tasks_list.size(),这个条件起不到任何作用,反而干扰了逻辑。冒泡排序逻辑缺陷
你的冒泡排序没有控制内层循环的范围,正常来说冒泡排序每一轮只需要比较到倒数第二个元素(因为要和下一个元素对比),而你的循环让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
相关产品推荐
相关产品推荐

