STL priority_queue <pair> vs. map </pair>

时间:2015-01-12 09:00:15

标签: c++ stl priority-queue

我需要一个优先级队列来存储每个键的值,而不仅仅是键。我认为可行的选项是std::multi_map<K,V>,因为它按关键顺序迭代,或者std::priority_queue<std::pair<K,V>>,因为它在V之前对K进行排序。除了个人偏好之外,我是否应该优先考虑另一个?他们是真的一样,还是我错过了什么?

1 个答案:

答案 0 :(得分:9)

优先级队列最初在O(N)时间内排序,然后按递减顺序迭代所有元素需要O(N log N)时间。它存储在幕后的std::vector中,因此在big-O行为之后只有一个很小的系数。但是,其中一部分是在向量内部移动元素。如果sizeof (K)sizeof (V)很大,则会慢一些。

std::map是一个红黑树(通用实践中),因此插入元素需要O(N log N)时间,每次插入后都要对它们进行排序。它们存储为链接节点,因此每个项目都会产生mallocfree开销。然后花费O(N)时间迭代它们并破坏结构。

整体优先级队列通常应该具有更好的性能,但它更多地限制了您的使用:数据项将在迭代期间移动,并且您只能迭代一次。

如果您在迭代时不需要插入新项目,那么当然可以将std::sortstd::vector一起使用。这应该优于priority_queue一些常数因素。

与性能中的大多数事情一样,唯一可以判断的方法是尝试两种方式(使用真实世界的测试用例)和测量。

顺便说一下,为了最大限度地提高性能,您可以定义自定义比较函数以忽略V并仅比较K中的pair<K,V>