C++ 优先级队列“更大”选项不起作用

Posted

技术标签:

【中文标题】C++ 优先级队列“更大”选项不起作用【英文标题】:C++ priority queue "greater" option is not working 【发布时间】:2018-04-09 07:24:14 【问题描述】:

有什么问题?

当我使用 STL 的优先级队列时,我想使用最小堆,所以我使用如下代码。

它适用于默认选项,但它不适用于“更大的选项”

它总是像上图一样排列。我完全不知道为什么会这样。

struct node 
    string code;
    int fre;

    bool operator<(const node& rhs) const 
        return fre < rhs.fre;
    

    bool operator>(const node& rhs) const 
        return fre > rhs.fre;
    
;

std::priority_queue<node, vector<node>, greater<node>> q;
std::map<node,int> huffman_tree;

int main(void)

    int f;
    for (int i = 1; i <= n; i++) 
        string c;
        std::cin >> c >> f;
        node huffman =  c,f ;
        q.push(huffman);
    

    q.pop();

    return 0;

【问题讨论】:

那么你真正的问题又是什么? 与你的问题无关,但你对输入有一个奇怪的 C 和 C++。为什么使用scanf 和字符数组,而不是更安全的std::cin&gt;&gt; 运算符(用于输入)和std::string(用于字符串)? “不工作”和“编译器发生错误”不是有用的问题陈述。 究竟会发生什么?发布确切的错误消息。 更多相关问题请read about how to ask good questions。然后编辑您的问题,告诉我们什么问题出在哪里。 如何“它不工作”。也请阅读idownvotedbecau.se/itsnotworking 你怎么知道它不起作用?你没想到会发生什么? 【参考方案1】:

如果我正确理解您的问题,您正在调试器中查看优先级队列,并且对为什么队列中的项目未按您预期的顺序存储感到困惑。

优先队列不保证按优先顺序存储项目。他们只保证在您将物品从队列中弹出时按优先顺序归还您。将项目保持在优先级顺序意味着每次将新项目放入队列时都必须执行排序操作,这将是低效的。相反,优先级队列通常使用称为堆的数据结构来管理队列,这样可以更有效地插入队列。

【讨论】:

我明白了。谢谢你。我意识到我必须学习更多。

以上是关于C++ 优先级队列“更大”选项不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥在c++中实现基于类的优先级队列时需要重载operator<?

优先队列

Java Collection - PriorityQueue 优先队列

Java 链表优先队列

初始化并插入优先级队列 (C++)

关于C++的权值优先队列的问题