将 STL priority_queue 与 Greater_equal 比较器类一起使用
Posted
技术标签:
【中文标题】将 STL priority_queue 与 Greater_equal 比较器类一起使用【英文标题】:Using STL priority_queue with greater_equal comparator class 【发布时间】:2018-12-06 08:14:47 【问题描述】:运行以下示例,我在标记的行中收到了一个调试断言。
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
有什么提示吗?非常感谢您的帮助!
【问题讨论】:
【参考方案1】:当您将 STL 数据结构与比较器一起使用时,该比较器必须是严格的,并且如果它接收到要比较的相等对象,则永远不要返回 true。
想象一下,当两个相等的对象被比较、交换并且下一次比较将再次在相同的 2 个对象之间进行比较时。在这种情况下,STL 排序步骤将永远不会停止。
尝试std::greater
而不是std::greater_equal
【讨论】:
我理解你的解释,但我仍然想知道 std::greater_equal 吗?你能举个例子说明什么时候使用它... 我不认为 std::greater_equal 曾经用于 STL 数据结构(但也许我错了)。几乎所有时候,您都会在 STL 中发现比您严格需要的更多功能,因为有人可以在个人任务中使用它们。任务如下:计算数组中的元素 >= 0(在此处找到示例:cplusplus.com/reference/functional/greater_equal)【参考方案2】:你有未定义的行为。您的实现很好,并在检测到时断言。与std::priority_queue
一起使用的比较器必须满足指定的要求Compare。 std::greater_equal
不会,因为如果你传递相等的值,它会返回 true。
来自相关文档
类型
T
满足比较 if给定
comp
,T
类型的对象要求
对于所有a
、comp(a,a)==false
【讨论】:
感谢您的帮助!【参考方案3】:无法重现:
#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
请指定使用的确切编译标志
【讨论】:
以上是关于将 STL priority_queue 与 Greater_equal 比较器类一起使用的主要内容,如果未能解决你的问题,请参考以下文章
c ++ stl更正参数到priority_queue [关闭]