c++ - std::set 和 std::priority_queue 之间的区别

标签 c++ algorithm sorting priority-queue

由于 std::priority_queuestd::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/

相关文章:

c++ - 如何解析 "invalid operands of types ' const char [ ]' and ' const char *' to binary ' operator +' "

c++ - 如何将正确的 Visual Studio 版本设置为 JIT 调试器?

c - 按升序对数组进行排序。编译后没有输出。似乎无法理解这个问题。?

c++ - 当字符包含表情符号时如何比较字符?

python - 添加新元素时 Heapify 不起作用

c++ - 在这种情况下,Win32 错误代码 122 是否有点良性?

c++ - 从模板类切换时,为什么出现<错误类型>?

python - 检查列表中的所有元素是否相同

php - 二维数组中的所有可能性

Python - 遗传算法错误的帮助