Namespaces
Variants

std::ranges::sort_heap

Из ru.cppreference.net
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы для диапазонов (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Неизменяющие операции последовательности    
Групповые операции
(C++17)
Операции поиска
Изменяющие операции последовательности
Операции копирования
(C++11)
(C++11)
Операции обмена
Операции преобразования
Операции генерации
Операции удаления
Операции изменения порядка
(до C++17)(C++11)
(C++20)(C++20)
Операции выборки
(C++17)

Сортировка и связанные операции
Операции разбиения
(C++11)    

Операции сортировки
Операции двоичного поиска
(на разбитых диапазонах)
Операции над множествами (на отсортированных диапазонах)
Операции слияния (на отсортированных диапазонах)
Операции с кучей
Операции минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановок


Политики выполнения (C++17)
(только для демонстрации*)(C++26)

Численные операции
(C++11)
(C++17)
(C++17)    

Специализированные <memory> алгоритмы

Специализированные <random> алгоритмы
Библиотека C









 
Ограниченные алгоритмы
Все имена в этом меню принадлежат пространству имён std::ranges
Неизменяющие операции последовательности
Изменяющие операции последовательности
Операции разбиения
Операции сортировки
Операции двоичного поиска (на отсортированных диапазонах)
       
       
Операции над множествами (на отсортированных диапазонах)
Операции с кучей
Операции минимума/максимума
       
       
Операции перестановок
Операции свёртки
Операции над неинициализированной памятью
Типы возврата
 
Определено в заголовке <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 sort_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>
    sort_heap( R&& r, Comp comp = {}, Proj proj = {} );
(2) (начиная с C++20)

Сортирует элементы в указанном диапазоне в соответствии с comp и proj, при этом изначально диапазон представлял собой кучу в соответствии с comp и proj. После сортировки диапазон больше не сохраняет свойство кучи.

1) Указанный диапазон — это [first, last).
2) Указанный диапазон — это r.

Если указанный диапазон не является кучей в соответствии с comp и proj, поведение не определено.

Объекты, напоминающие функции, описанные на этой странице, являются объектами-функциями алгоритмов (неофициально известными как niebloids), то есть:

Параметры

first, last - пара итератор-страж, определяющая диапазон элементов для модификации
r - range элементов для модификации
comp - компаратор для применения к проецируемым элементам
proj - проекция для применения к элементам

Возвращаемое значение

1) last

Сложность

Не более 2N⋅log(N) применений comp и 4N⋅log(N) применений proj , где N это:

1) ranges:: distance ( first, last )

Возможная реализация

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{};

Пример

#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);
}

Вывод:

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

Смотрите также

проверяет, является ли заданный диапазон максимальной кучей
(функциональный объект алгоритма)
находит наибольший поддиапазон, являющийся максимальной кучей
(функциональный объект алгоритма)
создает максимальную кучу из диапазона элементов
(функциональный объект алгоритма)
удаляет наибольший элемент из максимальной кучи
(функциональный объект алгоритма)
добавляет элемент в максимальную кучу
(функциональный объект алгоритма)
преобразует максимальную кучу в диапазон элементов, отсортированных в порядке возрастания
(шаблон функции)