Namespaces
Variants

std::ranges::sort_heap

From cppreference.com
 
 
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy, ranges::sort, ...
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
(C++11)    

Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
(C++11)
(C++17)
Lexicographical comparison operations
Permutation operations


 
Constrained algorithms
All names in this menu belong to namespace std::ranges
Non-modifying sequence operations
Fold operations (Helper templates)
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
Specialized <memory> algorithms
Return types
 
Defined in header <algorithm>
Call signature
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 sort_heap( I first, S last, Comp comp = {}, Proj proj = {} );
(1) (since 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>
    sort_heap( R&& r, Comp comp = {}, Proj proj = {} );
(2) (since C++20)

Converts the heap with respect to comp and proj that is represented by the target range [first, last) or r into a range sorted with respect to comp and proj. The heap property is no longer maintained.

If the target range does not originally represent a heap with respect to comp and proj, the behavior is undefined.

The function-like entities described on this page are algorithm function objects (informally known as niebloids), that is:

Parameters

first, last - the iterator-sentinel pair defining the target range
r - the target range
comp - the comparator to be applied to the (projected) elements
proj - the projection to be applied to the elements

Return value

The past-the-end iterator of the target range.

Complexity

Given N as ranges::distance(first, last) or ranges::distance(r):

1,2) At most 2N⋅log(N) applications of comp, and twice as many applications of proj.

Possible implementation

struct sort_heap_fn
{
    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 operator()(I first, S last, Comp comp = {}, Proj proj = {}) const
    {
        auto ret{ranges::next(first, last)};
        for (auto last{ret}; first != last; --last)
            ranges::pop_heap(first, last, comp, proj);
        return ret;
    }
    
    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>
        operator()(R&& r, Comp comp = {}, Proj proj = {}) const
    {
        return (*this)(ranges::begin(r),
                       ranges::next(ranges::begin(r), ranges::end(r)),
                       std::move(comp), std::move(proj));
    }
};

inline constexpr sort_heap_fn sort_heap{};

Example

import std;

int main()
{
    std::array v{3, 1, 4, 1, 5, 9};
    std::print("original array:  {}\n", v);

    std::ranges::make_heap(v);
    std::print("after make_heap: {}\n", v);

    std::ranges::sort_heap(v);
    std::print("after sort_heap: {}\n", v);
}

Output:

original array:  [3, 1, 4, 1, 5, 9]
after make_heap: [9, 5, 4, 1, 1, 3]
after sort_heap: [1, 1, 3, 4, 5, 9]

See also

turns a max heap into a range of elements sorted in ascending order
(function template) [edit]
checks if the given range is a max heap
(algorithm function object)[edit]
finds the largest subrange that is a max heap
(algorithm function object)[edit]
creates a max heap out of a range of elements
(algorithm function object)[edit]
removes the largest element from a max heap
(algorithm function object)[edit]
adds an element to a max heap
(algorithm function object)[edit]