将 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 一起使用的比较器必须满足指定的要求Comparestd::greater_equal 不会,因为如果你传递相等的值,它会返回 true。

来自相关文档

类型T满足比较 if

给定

compT 类型的对象

要求

对于所有acomp(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 [关闭]

STL - priority_queue(优先队列)

C++STL-stack与queue以及priority_queue

STL priority_queue 的自定义分配器

STL 可迭代容器,例如 priority_queue

STL之priority_queue