Namespaces
Variants

std::ranges:: sort_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
Definido en el encabezado <algorithm>
Firma de llamada
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) (desde 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) (desde C++20)

Ordena los elementos en el rango especificado con respecto a comp y proj , donde el rango originalmente representa un heap con respecto a comp y proj . El rango ordenado ya no mantiene la propiedad de heap.

1) El rango especificado es [ first , last ) .
2) El rango especificado es r .

Si el rango especificado no es un heap con respecto a comp y proj , el comportamiento es indefinido.

Las entidades similares a funciones descritas en esta página son algorithm function objects (conocidas informalmente como niebloids ), es decir:

Contenidos

Parámetros

first, last - el par iterador-centinela que define el rango de elementos a modificar
r - el range de elementos a modificar
comp - comparador a aplicar a los elementos proyectados
proj - proyección a aplicar a los elementos

Valor de retorno

1) last

Complejidad

Como máximo 2N⋅log(N) aplicaciones de comp y 4N⋅log(N) aplicaciones de proj , donde N es:

1) ranges:: distance ( first, last )

Implementación posible

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::end(r), std::move(comp), std::move(proj));
    }
};
inline constexpr sort_heap_fn sort_heap{};

Ejemplo

#include <algorithm>
#include <array>
#include <iostream>
void print(auto const& rem, const auto& v)
{
    std::cout << rem;
    for (const auto i : v)
        std::cout << i << ' ';
    std::cout << '\n';
}
int main()
{
    std::array v{3, 1, 4, 1, 5, 9};
    print("original array:  ", v);
    std::ranges::make_heap(v);
    print("after make_heap: ", v);
    std::ranges::sort_heap(v);
    print("after sort_heap: ", v);
}

Salida:

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

Véase también

verifica si el rango dado es un montículo máximo
(objeto función de algoritmo)
encuentra el mayor subrango que es un montículo máximo
(objeto función de algoritmo)
crea un montículo máximo a partir de un rango de elementos
(objeto función de algoritmo)
elimina el elemento más grande de un montículo máximo
(objeto función de algoritmo)
añade un elemento a un montículo máximo
(objeto función de algoritmo)
convierte un montículo máximo en un rango de elementos ordenados en orden ascendente
(plantilla de función)