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

C++ priority_queue自定义cmp比较器后队列元素无序是什么原因?

问题原因分析
  • 比较函数存在笔误,未参与第二个入参的比较
    当前你写的比较逻辑为return a.Pos.Y > a.Pos.Y;,左右两边均取第一个参数a的Y坐标做比较,表达式永远返回false,相当于判定所有元素优先级相同,自然不会按照预期规则排序。如果需要按Y坐标降序排列,修改为return a.Pos.Y > b.Pos.Y;即可。
  • 比较函数为非静态成员函数,不符合优先队列比较器的签名要求
    类的非静态成员函数隐含this指针作为隐式入参,实际签名和优先队列要求的二元谓词签名不匹配,直接使用会导致编译失败或者运行时异常。需要将cmp函数声明为静态成员函数,或者移到类外定义为全局函数。
  • 优先队列未初始化比较器实例
    你使用函数指针作为优先队列的比较器类型时,默认构造的队列持有的函数指针为空,调用时会触发未定义行为,需要在类的构造函数初始化列表中给队列传入正确的比较器实例。
最小改动修复代码
struct MyAlgo 
{
   // 初始化队列时传入比较器
   MyAlgo() : Queue(&cmp) {
      // 随机生成点位
      for (auto pos : RandomPostions)
        Queue.push({SiteEvent, pos, NULL});
   }
   struct Event
   {
      EventType Type;
      FVector2D Pos;
      Node* Arc;
   };
   // 改为静态成员函数,修正比较逻辑
   static bool cmp(const Event& a, const Event& b) { 
       return a.Pos.Y > b.Pos.Y; 
   }
   std::priority_queue<Event, std::vector<Event>, decltype(&cmp)> Queue;
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:45:01