【问题标题】:What heap structure does C++ STL priority queue use?C++ STL 优先级队列使用什么堆结构?
【发布时间】:2014-10-18 20:16:17
【问题描述】:

具体来说,STL 优先级队列容器适配器使用什么堆变体?我将它与我自己的手动二进制堆和双桶结构实现进行基准测试,所以只是想知道。任何有趣的实现知识都可以加分!

【问题讨论】:

  • std::*_heap 函数是可能的。
  • 由于这是特定于实现的,您对哪个特定的实现感兴趣?
  • 在 Visual Studio 2012 上,他们使用 std::make_heap() 创建堆。默认情况下,这是一个最大堆。如果您需要确切的详细信息,您应该只检查系统上的源代码。
  • 实施 = Apple LLVM 5.1 版 (clang-503.0.40)(基于 LLVM 3.4svn)
  • @chris:不仅仅是可能性。 priority_queue 被指定使用这些函数。

标签: c++ data-structures stl heap priority-queue


【解决方案1】:

这个问题被标记为 C++(而不是询问特定编译器的实现特定细节),所以我检查了标准以获取任何信息。在 23.6.4 的各个部分中,我们了解到 priority_queue 的行为就像使用 make_heappush_heappop_heap 一样。然后将这些函数记录(在25.4.6 部分中)分别具有复杂性At most 3 * (last - first) comparisons.At most log(last - first) comparisons.At most 2 * log(last - first) comparisons.。因此,这些特征可能会指示某些堆实现,但不会调用特定的堆。

【讨论】:

    【解决方案2】:

    您可以选择priority_queue 下的容器。如果未指定,则默认使用 std::vector:

    template<
        class T,
        class Container = std::vector<T>,
        class Compare = std::less<typename Container::value_type>
    > class priority_queue;
    

    Container - 用于存储 元素。容器必须满足以下要求 序列容器。此外,它必须提供以下内容 具有通常语义的函数:front() push_back() pop_back() 标准容器 std::vector 和 std::deque 满足这些 要求。

    堆由*_heap 函数以简单的方式实现。您可以在此处检查代码: http://www.sgi.com/tech/stl/stl_heap.h

    【讨论】:

    • 底层容器的选择与堆的组织方式无关。
    猜你喜欢
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    相关资源
    最近更新 更多