【发布时间】:2008-10-30 19:32:12
【问题描述】:
我需要将我的 A 类对象存储在一些数据结构中。 另外,我希望它们根据一个键自动排序,在我的例子中,它是另一个 B 类的嵌入对象。
因此我决定使用 STL 优先级队列。
但是,两个或多个对象 B 可能具有相同的键值。
我的问题:
STL 优先级队列是否允许重复键?
如果它做了我应该考虑什么以及我应该使用哪个谓词?
我知道我可以使用多重集,但它的大 O 表示法性能更差,这就是我想使用优先级队列的原因。
【问题讨论】:
我需要将我的 A 类对象存储在一些数据结构中。 另外,我希望它们根据一个键自动排序,在我的例子中,它是另一个 B 类的嵌入对象。
因此我决定使用 STL 优先级队列。
但是,两个或多个对象 B 可能具有相同的键值。
我的问题:
STL 优先级队列是否允许重复键?
如果它做了我应该考虑什么以及我应该使用哪个谓词?
我知道我可以使用多重集,但它的大 O 表示法性能更差,这就是我想使用优先级队列的原因。
【问题讨论】:
STL 优先级队列是否允许重复键?
是的。
如果它做了我应该考虑什么
相等元素之间的顺序可以任意改变。
我应该使用哪个谓词?
你的意思是?这完全取决于你的语义。
【讨论】:
是的,它支持重复键。
来自文档:
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
至于谓词,使用你之前使用过的任何东西 - 优先级队列所保证的任何东西都不会因为允许相等的元素而被破坏,所以你的算法应该可以正常工作。
【讨论】:
康拉德有一个很好的答案,补充一下。你应该知道priority_queue不一定有很好的性能。根据这个页面http://www.cs.brown.edu/~jwicks/libstdc++/html_user/classstd_1_1priority__queue.html,看起来它是通过对所有操作执行make_heap、pop_heap等来获得最高优先级的。
与其他数据结构相比,重新堆化可能会很昂贵,具体取决于您的用例。
【讨论】: