我需要在一些数据结构中存储我的类A对象。 另外,我希望它们能够根据一个键自动排序,在我的例子中是另一个B类的嵌入对象。
因此我决定使用STL优先级队列。
但是,2个或更多个对象B可能具有相同的键值。
我的问题:
STL优先级队列是否允许重复键?
如果它确实应该考虑我应该使用哪个谓词?
我知道我可以使用多重集,但它的Big O表示法表现更差,这就是为什么我要使用优先级队列。
答案 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等来实现的,以获得最高优先级。
与其他数据结构相比,重新堆叠可能比较昂贵,具体取决于您的用例。