Namespaces
Variants

std:: 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
sort_heap
(C++11)
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Определено в заголовке <algorithm>
template < class RandomIt >
void sort_heap ( RandomIt first, RandomIt last ) ;
(1) (constexpr since C++20)
template < class RandomIt, class Compare >
void sort_heap ( RandomIt first, RandomIt last, Compare comp ) ;
(2) (constexpr since C++20)

Преобразует кучу [ first , last ) в отсортированный диапазон. Свойство кучи больше не сохраняется.

1) Куча организована относительно operator < (until C++20) std:: less { } (since C++20) и будет отсортирована относительно operator < (until C++20) std:: less { } (since C++20) .
2) Куча организована относительно comp и будет отсортирована относительно comp .

Если выполняется любое из следующих условий, поведение не определено:

  • [ first , last ) не является кучей.
(до C++11)
(начиная с C++11)

Содержание

Параметры

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

Сигнатура функции сравнения должна быть эквивалентна следующей:

bool cmp ( const Type1 & a, const Type2 & b ) ;

Хотя сигнатура не обязана содержать const & , функция не должна модифицировать передаваемые ей объекты и должна быть способна принимать все значения типов (возможно const) Type1 и Type2 независимо от категории значения (следовательно, Type1 & не допускается , как и Type1 , если для Type1 перемещение не эквивалентно копированию (начиная с C++11) ).
Типы Type1 и Type2 должны быть такими, чтобы объект типа RandomIt мог быть разыменован и неявно преобразован к обоим из них.

Требования к типам
-
RandomIt должен удовлетворять требованиям LegacyRandomAccessIterator .
-
Compare должен удовлетворять требованиям Compare .

Сложность

Дано N как std:: distance ( first, last ) :

1) Не более 2N⋅log(N) сравнений с использованием operator < (до C++20) std:: less { } (начиная с C++20) .
2) Не более 2N⋅log(N) применений функции сравнения comp .

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

sort_heap (1)
template<class RandomIt>
void sort_heap(RandomIt first, RandomIt last)
{
    while (first != last)
        std::pop_heap(first, last--);
}
sort_heap (2)
template<class RandomIt, class Compare>
void sort_heap(RandomIt first, RandomIt last, Compare comp)
{
    while (first != last)
        std::pop_heap(first, last--, comp);
}

Пример

#include <algorithm>
#include <iostream>
#include <string_view>
#include <vector>
void println(std::string_view fmt, const auto& v)
{
    for (std::cout << fmt; const auto &i : v)
        std::cout << i << ' ';
    std::cout << '\n';
}
int main()
{
    std::vector<int> v{3, 1, 4, 1, 5, 9};
    std::make_heap(v.begin(), v.end());
    println("after make_heap, v: ", v);
    std::sort_heap(v.begin(), v.end());
    println("after sort_heap, v: ", v);
}

Вывод:

after make_heap, v: 9 4 5 1 1 3
after sort_heap, v: 1 1 3 4 5 9

Отчёты о дефектах

Следующие отчеты об изменениях в поведении, содержащие исправления дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 2444 C++98 at most N⋅log(N) comparisons were allowed increased to 2N⋅log(N)

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

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