Namespaces
Variants

std::ranges::pop_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 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("initially, v: ", v.cbegin(), v.cend());
    std::ranges::make_heap(v);
    print("make_heap, v: ", v.cbegin(), v.cend());
    print("convert heap into sorted array:");
    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");
    }
}

Вывод:

initially, v: 3 1 4 1 5 9 2 6 5 3
make_heap, v: 9 6 4 5 5 3 2 1 1 3
convert heap into sorted array:
[ 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 ]

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

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