我需要一个优先级队列来存储每个键的值,而不仅仅是键。我认为可行的选项是std::multi_map<K,V>
,因为它按关键顺序迭代,或者std::priority_queue<std::pair<K,V>>
,因为它在V之前对K进行排序。除了个人偏好之外,我是否应该优先考虑另一个?他们是真的一样,还是我错过了什么?
答案 0 :(得分:9)
优先级队列最初在O(N)时间内排序,然后按递减顺序迭代所有元素需要O(N log N)时间。它存储在幕后的std::vector
中,因此在big-O行为之后只有一个很小的系数。但是,其中一部分是在向量内部移动元素。如果sizeof (K)
或sizeof (V)
很大,则会慢一些。
std::map
是一个红黑树(通用实践中),因此插入元素需要O(N log N)时间,每次插入后都要对它们进行排序。它们存储为链接节点,因此每个项目都会产生malloc
和free
开销。然后花费O(N)时间迭代它们并破坏结构。
整体优先级队列通常应该具有更好的性能,但它更多地限制了您的使用:数据项将在迭代期间移动,并且您只能迭代一次。
如果您在迭代时不需要插入新项目,那么当然可以将std::sort
与std::vector
一起使用。这应该优于priority_queue
一些常数因素。
与性能中的大多数事情一样,唯一可以判断的方法是尝试两种方式(使用真实世界的测试用例)和测量。
顺便说一下,为了最大限度地提高性能,您可以定义自定义比较函数以忽略V
并仅比较K
中的pair<K,V>
。