具有重复键的STL优先级队列 - 是否可能?

时间:2008-10-30 19:32:12

标签: c++ stl

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

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

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

我的问题:

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

如果它确实应该考虑我应该使用哪个谓词?

我知道我可以使用多重集,但它的Big O表示法表现更差,这就是为什么我要使用优先级队列。

3 个答案:

答案 0 :(得分:16)

  

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

  

如果它做了我应该考虑的事情

相等元素之间的顺序可能会随意改变。

  

我应该使用哪个谓词?

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

答案 1 :(得分:5)

是的,它支持重复键。

来自doucumentation:

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

对于谓词,请使用之前使用的任何内容 - 优先级队列保证不会因允许相同的元素而中断,因此您的算法应该可以正常工作。

答案 2 :(得分:2)

Konrad有一个很好的答案,补充一点。您应该知道priority_queue不一定具有很好的性能。根据这个页面http://www.cs.brown.edu/~jwicks/libstdc++/html_user/classstd_1_1priority__queue.html,看起来它是通过在所有操作上执行make_heap,pop_heap等来实现的,以获得最高优先级。

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

相关问题