将STL priority_queue与Greater_equal比较器类一起使用

时间:2018-12-06 08:14:47

标签: c++ stl priority-queue

运行以下示例,我在标记的行中收到调试断言。

std::priority_queue<int, std::vector<int>, std::greater_equal<int>> queue_int;
queue_int.push(1);
queue_int.push(2);
queue_int.push(1); // Debug Assertion Failed: Expression invalid comparator

有任何提示吗?帮助非常感谢!

3 个答案:

答案 0 :(得分:4)

始终将STL数据结构与比较器一起使用时,该比较器必须严格,并且在接收到相等的要比较的对象时永远不要返回true。

想象一下,比较,交换两个相等的对象并且下一次比较将再次出现在相同的两个对象之间的情况。在这种情况下,STL排序步骤将永远不会停止。

尝试用std::greater代替std::greater_equal

答案 1 :(得分:1)

您的行为不确定。您的实现很好,并在检测到该条件时断言。与std::priority_queue一起使用的比较器必须满足命名要求Comparestd::greater_equal不会,因为如果您传递相等的值,它将返回true。

从相关文档中获得

  

如果

,类型T满足比较      

给予

     
      
  • comp,类型为T的对象
  •   
     

要求

     
      
  • 对于所有acomp(a,a)==false
  •   

答案 2 :(得分:-2)

无法复制:

#include <stdio.h>
#include <vector>
#include <queue>

int main(int argc, char **argv)
{
    std::priority_queue<int, std::vector<int>, std::greater_equal<int>> queue_int;
    queue_int.push(1);
    queue_int.push(2);
    queue_int.push(1); // Debug Assertion Failed: Expression invalid comparator
    return 0;
}

和编译行:

$ g++ -std=c++17 -o main main.cpp

请指定使用的确切编译标志