由于 std::priority_queue
和 std::set
(和 std::multiset
)都是存储元素并允许您以有序的方式访问它们,并且具有相同的插入复杂度 O(log n)
,使用其中一个有什么优势(或者,什么样的情况需要一个或其他?)?
虽然我知道底层结构不同,但我对它们实现的差异并不感兴趣,而是比较它们的性能和适用性各种用途。
注意:我知道集合中的无重复项。这就是我还提到 std::multiset
的原因,因为它与 std::set
具有完全相同的行为,但可以在允许存储的数据进行比较的情况下使用元素。所以请不要评论单/多键问题。
最佳答案
优先级队列only 允许您按排序顺序访问 one 元素——即,您可以获得最高优先级的项目,当您删除它时,您可以获得下一个最高优先级,依此类推。优先级队列还允许重复元素,因此它更像是一个多重集而不是一个集。 [编辑:正如@Tadeusz Kopec 所指出的,构建一个堆也与堆中的项目数成线性关系,其中构建一个集合是 O(N log N) 除非它是从已经排序的序列构建的(在这种情况下它也是线性的)。]
集合允许您按排序顺序进行完全访问,例如,您可以在集合中间的某个位置找到两个元素,然后按顺序从一个元素遍历到另一个元素。
关于c++ - std::set 和 std::priority_queue 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10141841/