运行以下示例,我在标记的行中收到调试断言。
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
有任何提示吗?帮助非常感谢!
答案 0 :(得分:4)
始终将STL数据结构与比较器一起使用时,该比较器必须严格,并且在接收到相等的要比较的对象时永远不要返回true。
想象一下,比较,交换两个相等的对象并且下一次比较将再次出现在相同的两个对象之间的情况。在这种情况下,STL排序步骤将永远不会停止。
尝试用std::greater
代替std::greater_equal
答案 1 :(得分:1)
您的行为不确定。您的实现很好,并在检测到该条件时断言。与std::priority_queue
一起使用的比较器必须满足命名要求Compare。 std::greater_equal
不会,因为如果您传递相等的值,它将返回true。
从相关文档中获得
如果
,类型T
满足比较给予
comp
,类型为T
的对象要求
- 对于所有
a
,comp(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
请指定使用的确切编译标志