【问题标题】:STL priority queue with duplicate keys - is it possible?具有重复键的 STL 优先级队列 - 可能吗?
【发布时间】:2008-10-30 19:32:12
【问题描述】:

我需要将我的 A 类对象存储在一些数据结构中。 另外,我希望它们根据一个键自动排序,在我的例子中,它是另一个 B 类的嵌入对象。

因此我决定使用 STL 优先级队列。

但是,两个或多个对象 B 可能具有相同的键值。

我的问题:

STL 优先级队列是否允许重复键?

如果它做了我应该考虑什么以及我应该使用哪个谓词?

我知道我可以使用多重集,但它的大 O 表示法性能更差,这就是我想使用优先级队列的原因。

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    STL 优先级队列是否允许重复键?

    是的。

    如果它做了我应该考虑什么

    相等元素之间的顺序可以任意改变。

    我应该使用哪个谓词?

    你的意思是?这完全取决于你的语义。

    【讨论】:

      【解决方案2】:

      是的,它支持重复键。

      来自文档:

      void push(const value_type& x) Inserts x into the priority_queue.
                                     Postcondition: size() will be incremented by 1. 
      

      一个简单的测试证实了这一点:

      int main() {
        priority_queue<int> q;
        q.push(5);
        q.push(5);
        cout << q.top() << endl;
        q.pop();
        cout << q.top() << endl;
        q.pop();
      }
      

      输出:

      5
      5
      

      至于谓词,使用你之前使用过的任何东西 - 优先级队列所保证的任何东西都不会因为允许相等的元素而被破坏,所以你的算法应该可以正常工作。

      【讨论】:

        【解决方案3】:

        康拉德有一个很好的答案,补充一下。你应该知道priority_queue不一定有很好的性能。根据这个页面http://www.cs.brown.edu/~jwicks/libstdc++/html_user/classstd_1_1priority__queue.html,看起来它是通过对所有操作执行make_heap、pop_heap等来获得最高优先级的。

        与其他数据结构相比,重新堆化可能会很昂贵,具体取决于您的用例。

        【讨论】:

        • 根据我在数据结构中学到的知识,这基本上就是创建优先级队列的方法(例如en.wikipedia.org/wiki/Priority_queue#Implementation)。
        • 同意,我只是指出优先级队列不一定是超级高效的,因为他提到选择它是因为 set 的性能不佳。
        猜你喜欢
        • 1970-01-01
        • 2016-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-16
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        相关资源
        最近更新 更多