Namespaces
Variants

std::ranges:: pop_heap

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace std::ranges
Non-modifying sequence operations
Modifying sequence operations
Partitioning operations
Sorting operations
Binary search operations (on sorted ranges)
Set operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Permutation operations
Fold operations
Operations on uninitialized storage
Return types
定义于头文件 <algorithm>
调用签名
template < std:: random_access_iterator I, std:: sentinel_for < I > S,

class Comp = ranges:: less , class Proj = std:: identity >
requires std:: sortable < I, Comp, Proj >

constexpr I pop_heap ( I first, S last, Comp comp = { } , Proj proj = { } ) ;
(1) (C++20 起)
template < ranges:: random_access_range R,

class Comp = ranges:: less , class Proj = std:: identity >
requires std:: sortable < ranges:: iterator_t < R > , Comp, Proj >
constexpr ranges:: borrowed_iterator_t < R >

pop_heap ( R && r, Comp comp = { } , Proj proj = { } ) ;
(2) (C++20 起)

交换指定 中相对于 comp proj 的首元素与末元素,并将排除首位后的子范围调整为相对于 comp proj 的堆。此操作的效果是从指定堆中移除首元素。

1) 指定的堆为 [ first , last )
2) 指定的堆为 r

本页面描述的函数式实体是 算法函数对象 (非正式称为 niebloids ),即:

目录

参数

first, last - 定义待修改元素范围的 迭代器-哨位
r - 待修改元素的 range 范围
comp - 应用于投影元素的比较器
proj - 应用于元素的投影

返回值

1) last

复杂度

最多 2log(N) comp 调用和 4log(N) proj 调用,其中 N 表示:

1) ranges:: distance ( first, last )

示例

#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
#include <string_view>
template<class I = int*>
void print(std::string_view rem, I first = {}, I last = {},
           std::string_view term = "\n")
{
    for (std::cout << rem; first != last; ++first)
        std::cout << *first << ' ';
    std::cout << term;
}
int main()
{
    std::array v{3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
    print("初始状态, v: ", v.cbegin(), v.cend());
    std::ranges::make_heap(v);
    print("建堆后, v: ", v.cbegin(), v.cend());
    print("将堆转换为有序数组:");
    for (auto n {std::ssize(v)}; n >= 0; --n)
    {
        std::ranges::pop_heap(v.begin(), v.begin() + n);
        print("[ ", v.cbegin(), v.cbegin() + n, "]  ");
        print("[ ", v.cbegin() + n, v.cend(), "]\n");
    }
}

输出:

初始状态, v: 3 1 4 1 5 9 2 6 5 3
建堆后, v: 9 6 4 5 5 3 2 1 1 3
将堆转换为有序数组:
[ 6 5 4 3 5 3 2 1 1 9 ]  [ ]
[ 5 5 4 3 1 3 2 1 6 ]  [ 9 ]
[ 5 3 4 1 1 3 2 5 ]  [ 6 9 ]
[ 4 3 3 1 1 2 5 ]  [ 5 6 9 ]
[ 3 2 3 1 1 4 ]  [ 5 5 6 9 ]
[ 3 2 1 1 3 ]  [ 4 5 5 6 9 ]
[ 2 1 1 3 ]  [ 3 4 5 5 6 9 ]
[ 1 1 2 ]  [ 3 3 4 5 5 6 9 ]
[ 1 1 ]  [ 2 3 3 4 5 5 6 9 ]
[ 1 ]  [ 1 2 3 3 4 5 5 6 9 ]
[ ]  [ 1 1 2 3 3 4 5 5 6 9 ]

参见

向最大堆添加元素
(算法函数对象)
检查给定范围是否为最大堆
(算法函数对象)
查找构成最大堆的最大子范围
(算法函数对象)
从元素范围创建最大堆
(算法函数对象)
将最大堆转换为按升序排序的元素范围
(算法函数对象)
从最大堆中移除最大元素
(函数模板)