Пространства имён
Варианты
Действия

Заголовочный файл стандартной библиотеки <algorithm>

Материал из cppreference.com
< cpp‎ | header
 
 
Заголовочные файлы стандартной библиотеки
Языковая поддержка
Концепты
<concepts> (C++20)
Диагностика
<system_error> (C++11)

Управление памятью
<memory_resource> (C++17)  
Метапрограммирование
<type_traits> (C++11)
<ratio> (C++11)
Общие утилиты
<utility>
<tuple> (C++11)
<optional> (C++17)
<variant> (C++17)
<any> (C++17)
<expected> (C++23)
<bitset>

<charconv> (C++17)
<format> (C++20)
<bit> (C++20)

Строки
<cuchar> (C++11)

Контейнеры
<flat_set> (C++23)
<span> (C++20)
<mdspan> (C++23)

Итераторы
<iterator>
Диапазоны
<ranges> (C++20)
<generator> (C++23)
Алгоритмы
<algorithm>
Числа
<cfenv> (C++11)
<complex>
<numbers> (C++20)

Время
<chrono> (C++11)
Локализация
<codecvt> (C++11/17*)
Ввод/вывод
<filesystem> (C++17)
<cstdio>
<cinttypes> (C++11)
<strstream> (C++98*)
Регулярные выражения
<regex> (C++11)
Поддержка конкуренции
<stop_token> (C++20)
<thread> (C++11)
<atomic> (C++11)
<stdatomic.h> (C++23)
<mutex> (C++11)
<shared_mutex> (C++14)
<condition_variable> (C++11)  
<semaphore> (C++20)
<latch> (C++20)
<barrier> (C++20)
<future> (C++11)

Совместимость с C
<cstdbool> (C++11/17/20*)  
<ccomplex> (C++11/17/20*)
<ctgmath> (C++11/17/20*)

<cstdalign> (C++11/17/20*)

<ciso646> (до C++20)

 

Этот заголовочный файл является частью библиотеки algorithm.

Содержание

[править] Функции

Немодифицирующие операции над последовательностями
(C++11)(C++11)(C++11)
проверяет, равен ли предикат true для всех, любого или ни одного из элементов в диапазоне
(шаблон функции) [править]
применяет функцию к диапазону элементов
(шаблон функции) [править]
применяет объект функцию к первым n элементам последовательности
(шаблон функции) [править]
возвращает количество элементов, соответствующих определённым критериям
(шаблон функции) [править]
находит первую позицию, в которой два диапазона различаются
(шаблон функции) [править]
определяет, одинаковы ли два множества элементов
(шаблон функции) [править]
находит первый элемент, соответствущий определённым критериям
(шаблон функции) [править]
находит последнюю последовательность элементов в определённом диапазоне
(шаблон функции) [править]
ищет любой элемент из набора элементов
(шаблон функции) [править]
находит первые два соседних элемента, которые равны (или удовлетворяют заданному предикату)
(шаблон функции) [править]
ищет диапазон элементов
(шаблон функции) [править]
ищет несколько последовательных копий элемента в диапазоне
(шаблон функции) [править]
Модифицирующие операции над последовательностями
копирует диапазон элементов в новое место
(шаблон функции) [править]
(C++11)
копирует ряд элементов в новое место
(шаблон функции) [править]
копирует диапазон элементов в обратном порядке
(шаблон функции) [править]
(C++11)
перемещает диапазон элементов в новое место
(шаблон функции) [править]
перемещает диапазон элементов в новое место в обратном порядке
(шаблон функции) [править]
присваивает диапазону элементов определённое значение
(шаблон функции) [править]
присваивает значение определённому количеству элементов
(шаблон функции) [править]
применяет функцию к диапазону элементов, сохраняя результаты в целевом диапазоне
(шаблон функции) [править]
присваивает результаты последовательных вызовов функции каждому элементу в диапазоне
(шаблон функции) [править]
присваивает результаты последовательных вызовов функции N элементам в диапазоне
(шаблон функции) [править]
удаляет элементы, соответствующие определённым критериям
(шаблон функции) [править]
копирует диапазон элементов, исключая те, которые соответствуют определённым критериям
(шаблон функции) [править]
заменяет другим значением все значения, соответствующие определённым критериям
(шаблон функции) [править]
копирует диапазон, заменяя элементы, соответствующие определённым критериям, другим значением
(шаблон функции) [править]
меняет местами значения двух объектов
(шаблон функции) [править]
меняет местами два диапазона элементов
(шаблон функции) [править]
меняет местами элементы, на которые указывают два итератора
(шаблон функции) [править]
меняет порядок элементов в диапазоне на обратный
(шаблон функции) [править]
создаёт перевёрнутую копию диапазона
(шаблон функции) [править]
вращает порядок элементов в диапазоне
(шаблон функции) [править]
копирует и вращает диапазон элементов
(шаблон функции) [править]
(до C++17)(C++11)
случайным образом переупорядочивает элементы в диапазоне
(шаблон ��ункции) [править]
удаляет последовательные повторяющиеся элементы в диапазоне
(шаблон функции) [править]
создает копию некоторого диапазона элементов, не содержащую последовательных дубликатов
(шаблон функции) [править]
Операции разделения
определяет, разделён ли диапазон заданным предикатом
(шаблон функции) [править]
делит диапазон элементов на две группы
(шаблон функции) [править]
копирует диапазон, разделяя элементы на две группы
(шаблон функции) [править]
делит элементы на две группы с сохранением их относительного порядка
(шаблон функции) [править]
находит точку раздела разделённого на две группы диапазона
(шаблон функции) [править]
Операции сортировки
(C++11)
проверяет, отсортирован ли диапазон по возрастанию
(шаблон функции) [править]
находит наиболее длинный отсортированный префиксный поддиапазон
(шаблон функции) [править]
сортирует диапазон в порядке возрастания
(шаблон функции) [править]
сортирует первые N элементов диапазона
(шаблон функции) [править]
копирует и частично сортирует диапазон элементов
(шаблон функции) [править]
сортирует диапазон элементов, сохраняя порядок между равными элементами
(шаблон функции) [править]
частично сортирует заданный диапазон, убедившись, что он разделён заданным элементом
(шаблон функции) [править]
Операции двоичного поиска (на отсортированных диапазонах)
возвращает итератор на первый элемент не меньший, чем заданное значение
(шаблон функции) [править]
возвращает итератор на первый элемент, который больше определённого значения
(шаблон функции) [править]
определяет, существует ли элемент в частично упорядоченном диапазоне
(шаблон функции) [править]
возвращает диапазон элементов, соответствующих определённому ключу
(шаблон функции) [править]
Прочие операции на отсортированных диапазонах
объединяет два отсортированных диапазона
(шаблон функции) [править]
объединяет два упорядоченных диапазона на месте
(шаблон функции) [править]
Операции для множеств (на отсортированных диапазонах)
возвращает true, если одна последовательность является подпоследовательностью другой
(шаблон функции) [править]
вычисляет разницу между двумя наборами
(шаблон функции) [править]
вычисляет пересечение двух множеств
(шаблон функции) [править]
вычисляет симметричную разницу между двумя наборами
(шаблон функции) [править]
вычисляет объединение двух множеств
(шаблон функции) [править]
Операции над кучей
проверяет, является ли указанный диапазон максимальной кучей
(шаблон функции) [править]
находит самый большой поддиапазон, который составляет максимальную кучу
(шаблон функции) [править]
создаёт максимальную кучу из диапазона элементов
(шаблон функции) [править]
добавляет элемент в максимальную кучу
(шаблон функции) [править]
удаляет наибольший элемент из максимальной кучи
(шаблон функции) [править]
превращает максимальную кучу в диапазон элементов, отсортированных в порядке возрастания
(шаблон функции) [править]
Операции минимума/максимума
возвращает большее из заданных значений
(шаблон функции) [править]
возвращает наибольший элемент в диапазоне
(шаблон функции) [править]
возвращает меньшее из заданных значений
(шаблон функции) [править]
возвращает наименьший элемент в диапазоне
(шаблон функции) [править]
(C++11)
возвращает меньший и больший из двух элементов
(шаблон функции) [править]
возвращает наименьший и наибольший элементы в диапазоне
(шаблон функции) [править]
(C++17)
приводит значение к диапазону между парой граничных значений
(шаблон функции) [править]
Операции сравнения
определяет, одинаковы ли два множества элементов
(шаблон функции) [править]
возвращает true, если один диапазон лексикографически меньше другого
(шаблон функции) [править]
сравнивает два диапазона, используя трёхстороннее сравнение
(шаблон функции) [править]
Операции перестановки
определяет, является ли последовательность перестановкой другой последовательности
(шаблон функции) [править]
генерирует следующую большую лексикографическую перестановку диапазона элементов
(шаблон функции) [править]
генерирует следующую меньшую лексикографическую перестановку диапазона элементов
(шаблон функции) [править]

[править] Определение

#include <initializer_list>
 
namespace std {
    // немодифицирующие операции над последовательностями
    template <class InputIter, class Pred>
        bool all_of(InputIter first, InputIter last, Pred pred);
    template <class InputIter, class Pred>
        bool any_of(InputIter first, InputIter last, Pred pred);
    template <class InputIter, class Pred>
        bool none_of(InputIter first, InputIter last, Pred pred);
 
    template<class InputIter, class Function>
        Function for_each(InputIter first, InputIter last, Function f);
    template<class InputIter, class Size, class Function>
        InputIter for_each_n(InputIter first, Size n, Function f);
 
    template<class InputIter, class T>
        InputIter find(InputIter first, InputIter last,
                           const T& value);
    template<class InputIter, class Pred>
        InputIter find_if(InputIter first, InputIter last,
                              Pred pred);
    template<class InputIter, class Pred>
        InputIter find_if_not(InputIter first, InputIter last,
                                  Pred pred);
 
    template<class ForwardIter1, class ForwardIter2>
        ForwardIter1
        find_end(ForwardIter1 first1, ForwardIter1 last1,
                 ForwardIter2 first2, ForwardIter2 last2);
    template<class ForwardIter1, class ForwardIter2,
             class BinaryPred>
        ForwardIter1
        find_end(ForwardIter1 first1, ForwardIter1 last1,
                 ForwardIter2 first2, ForwardIter2 last2,
                 BinaryPred pred);
 
    template<class InputIter, class ForwardIter>
        InputIter
        find_first_of(InputIter first1, InputIter last1,
                      ForwardIter first2, ForwardIter last2);
    template<class InputIter, class ForwardIter,
             class BinaryPred>
        InputIter
        find_first_of(InputIter first1, InputIter last1,
                      ForwardIter first2, ForwardIter last2,
                      BinaryPred pred);
 
    template<class ForwardIter>
        ForwardIter adjacent_find(ForwardIter first,
                                      ForwardIter last);
    template<class ForwardIter, class BinaryPred>
        ForwardIter adjacent_find(ForwardIter first,
                                      ForwardIter last,
                                      BinaryPred pred);
    template<class InputIter, class T>
        typename iterator_traits<InputIter>::difference_type
        count(InputIter first, InputIter last, const T& value);
    template<class InputIter, class Pred>
        typename iterator_traits<InputIter>::difference_type
        count_if(InputIter first, InputIter last, Pred pred);
 
    template<class InputIter1, class InputIter2>
        pair<InputIter1, InputIter2>
        mismatch(InputIter1 first1, InputIter1 last1,
                 InputIter2 first2);
    template<class InputIter1, class InputIter2, class BinaryPred>
        pair<InputIter1, InputIter2>
        mismatch(InputIter1 first1, InputIter1 last1,
                 InputIter2 first2, BinaryPred pred);
 
    template<class InputIter1, class InputIter2>
        bool equal(InputIter1 first1, InputIter1 last1,
                   InputIter2 first2);
    template<class InputIter1, class InputIter2, class BinaryPred>
        bool equal(InputIter1 first1, InputIter1 last1,
                   InputIter2 first2, BinaryPred pred);
 
    template<class ForwardIter1, class ForwardIter2>
        bool is_permutation(ForwardIter1 first1, ForwardIter1 last1,
                            ForwardIter2 first2);
    template<class ForwardIter1, class ForwardIter2,
    class BinaryPred>
        bool is_permutation(ForwardIter1 first1, ForwardIter1 last1,
                            ForwardIter2 first2, BinaryPred pred);
 
    template<class ForwardIter1, class ForwardIter2>
        ForwardIter1 search(
            ForwardIter1 first1, ForwardIter1 last1,
            ForwardIter2 first2, ForwardIter2 last2);
    template<class ForwardIter1, class ForwardIter2,
             class BinaryPred>
        ForwardIter1 search(
            ForwardIter1 first1, ForwardIter1 last1,
            ForwardIter2 first2, ForwardIter2 last2,
            BinaryPred pred);
 
    template<class ForwardIter, class Size, class T>
        ForwardIter search_n(ForwardIter first, ForwardIter last,
                                 Size count, const T& value);
    template<class ForwardIter, class Size, class T, class BinaryPred>
        ForwardIter1 search_n(ForwardIter first, ForwardIter last,
                                  Size count, const T& value,
                                  BinaryPred pred);
 
    // модифицирующие операции над последовательностями
 
    // копирование
    template<class InputIter, class OutputIter>
        OutputIter copy(InputIter first, InputIter last,
                            OutputIter result);
    template<class InputIter, class Size, class OutputIter>
        OutputIter copy_n(InputIter first, Size n,
                              OutputIter result);
    template<class InputIter, class OutputIter, class Pred>
        OutputIter copy_if(InputIter first, InputIter last,
                               OutputIter result, Pred pred);
    template<class BidirectionalIter1, class BidirectionalIter2>
        BidirectionalIter2 copy_backward(
            BidirectionalIter1 first, BidirectionalIter1 last,
            BidirectionalIter2 result);
 
    // перемещение
    template<class InputIter, class OutputIter>
        OutputIter move(InputIter first, InputIter last,
                            OutputIter result);
    template<class BidirectionalIter1, class BidirectionalIter2>
        BidirectionalIter2 move_backward(
            BidirectionalIter1 first, BidirectionalIter1 last,
            BidirectionalIter2 result);
 
    // обмен
    template<class ForwardIter1, class ForwardIter2>
        ForwardIter2 swap_ranges(ForwardIter1 first1,
                                     ForwardIter1 last1, ForwardIter2 first2);
    template<class ForwardIter1, class ForwardIter2>
        void iter_swap(ForwardIter1 a, ForwardIter2 b);
    template<class InputIter, class OutputIter, class UnaryOperation>
        OutputIter transform(InputIter first, InputIter last,
                                 OutputIter result, UnaryOperation op);
 
    template<class InputIter1, class InputIter2, class OutputIter,
             class BinaryOperation>
        OutputIter transform(InputIter1 first1, InputIter1 last1,
                                 InputIter2 first2, OutputIter result,
                                 BinaryOperation binary_op);
 
    template<class ForwardIter, class T>
        void replace(ForwardIter first, ForwardIter last,
                     const T& old_value, const T& new_value);
    template<class ForwardIter, class Pred, class T>
        void replace_if(ForwardIter first, ForwardIter last,
                        Pred pred, const T& new_value);
    template<class InputIter, class OutputIter, class T>
        OutputIter replace_copy(InputIter first, InputIter last,
                                    OutputIter result,
                                    const T& old_value, const T& new_value);
    template<class InputIter, class OutputIter, class Pred, class T>
        OutputIter replace_copy_if(InputIter first, InputIter last,
                                       OutputIter result,
                                       Pred pred, const T& new_value);
 
    template<class ForwardIter, class T>
        void fill(ForwardIter first, ForwardIter last, const T& value);
    template<class OutputIter, class Size, class T>
        OutputIter fill_n(OutputIter first, Size n, const T& value);
    template<class ForwardIter, class Generator>
        void generate(ForwardIter first, ForwardIter last,
                      Generator gen);
    template<class OutputIter, class Size, class Generator>
        OutputIter generate_n(OutputIter first, Size n, Generator gen);
 
    template<class ForwardIter, class T>
        ForwardIter remove(ForwardIter first, ForwardIter last,
                               const T& value);
    template<class ForwardIter, class Pred>
        ForwardIter remove_if(ForwardIter first, ForwardIter last,
                                  Pred pred);
    template<class InputIter, class OutputIter, class T>
        OutputIter remove_copy(InputIter first, InputIter last,
                                   OutputIter result, const T& value);
    template<class InputIter, class OutputIter, class Pred>
        OutputIter remove_copy_if(InputIter first, InputIter last,
                                      OutputIter result, Pred pred);
 
    template<class ForwardIter>
        ForwardIter unique(ForwardIter first, ForwardIter last);
    template<class ForwardIter, class BinaryPred>
        ForwardIter unique(ForwardIter first, ForwardIter last,
                               BinaryPred pred);
    template<class InputIter, class OutputIter>
        OutputIter unique_copy(InputIter first, InputIter last,
                                   OutputIter result);
    template<class InputIter, class OutputIter, class BinaryPred>
        OutputIter unique_copy(InputIter first, InputIter last,
                                   OutputIter result, BinaryPred pred);
 
    template<class BidirectionalIter>
        void reverse(BidirectionalIter first, BidirectionalIter last);
    template<class BidirectionalIter, class OutputIter>
        OutputIter reverse_copy(BidirectionalIter first,
                                    BidirectionalIter last,
                                    OutputIter result);
 
    template<class ForwardIter>
        ForwardIter rotate(ForwardIter first, ForwardIter middle,
                               ForwardIter last);
    template<class ForwardIter, class OutputIter>
        OutputIter rotate_copy(
            ForwardIter first, ForwardIter middle,
            ForwardIter last, OutputIter result);
 
    template<class RandomAccessIter>
        void random_shuffle(RandomAccessIter first,
                            RandomAccessIter last);
    template<class RandomAccessIter, class RandomNumberGenerator>
        void random_shuffle(RandomAccessIter first,
                            RandomAccessIter last,
                            RandomNumberGenerator&& rand);
    template<class RandomAccessIter, class UniformRandomNumberGenerator>
        void shuffle(RandomAccessIter first,
                     RandomAccessIter last,
                     UniformRandomNumberGenerator&& rand);
 
    // разделение
    template <class InputIter, class Pred>
        bool is_partitioned(InputIter first, InputIter last, Pred pred);
 
    template<class ForwardIter, class Pred>
        ForwardIter partition(ForwardIter first,
                                  ForwardIter last,
                                  Pred pred);
 
    template<class BidirectionalIter, class Pred>
        BidirectionalIter stable_partition(BidirectionalIter first,
                                               BidirectionalIter last,
                                               Pred pred);
 
    template <class InputIter, class OutputIter1,
              class OutputIter2, class Pred>
        pair<OutputIter1, OutputIter2>
        partition_copy(InputIter first, InputIter last,
                       OutputIter1 out_true, OutputIter2 out_false,
                       Pred pred);
 
    template<class ForwardIter, class Pred>
        ForwardIter partition_point(ForwardIter first,
                                        ForwardIter last,
                                        Pred pred);
 
    // операции сортировки и связанные
 
    // сортировка
    template<class RandomAccessIter>
        void sort(RandomAccessIter first, RandomAccessIter last);
    template<class RandomAccessIter, class Compare>
        void sort(RandomAccessIter first, RandomAccessIter last,
                  Compare comp);
 
    template<class RandomAccessIter>
        void stable_sort(RandomAccessIter first, RandomAccessIter last);
    template<class RandomAccessIter, class Compare>
        void stable_sort(RandomAccessIter first, RandomAccessIter last,
                         Compare comp);
 
    template<class RandomAccessIter>
        void partial_sort(RandomAccessIter first,
                          RandomAccessIter middle,
                          RandomAccessIter last);
    template<class RandomAccessIter, class Compare>
        void partial_sort(RandomAccessIter first,
                          RandomAccessIter middle,
                          RandomAccessIter last, Compare comp);
    template<class InputIter, class RandomAccessIter>
        RandomAccessIter partial_sort_copy(
            InputIter first, InputIter last,
            RandomAccessIter result_first,
            RandomAccessIter result_last);
    template<class InputIter, class RandomAccessIter, class Compare>
        RandomAccessIter partial_sort_copy(
            InputIter first, InputIter last,
            RandomAccessIter result_first,
            RandomAccessIter result_last,
            Compare comp);
 
    template<class ForwardIter>
        bool is_sorted(ForwardIter first, ForwardIter last);
    template<class ForwardIter, class Compare>
        bool is_sorted(ForwardIter first, ForwardIter last,
                       Compare comp);
    template<class ForwardIter>
        ForwardIter is_sorted_until(ForwardIter first, ForwardIter last);
    template<class ForwardIter, class Compare>
        ForwardIter is_sorted_until(ForwardIter first, ForwardIter last,
                                        Compare comp);
 
    template<class RandomAccessIter>
        void nth_element(RandomAccessIter first, RandomAccessIter nth,
                         RandomAccessIter last);
    template<class RandomAccessIter, class Compare>
        void nth_element(RandomAccessIter first, RandomAccessIter nth,
                         RandomAccessIter last, Compare comp);
 
    // бинарный поиск
    template<class ForwardIter, class T>
        ForwardIter lower_bound(ForwardIter first, ForwardIter last,
                                    const T& value);
    template<class ForwardIter, class T, class Compare>
        ForwardIter lower_bound(ForwardIter first, ForwardIter last,
                                    const T& value, Compare comp);
 
    template<class ForwardIter, class T>
        ForwardIter upper_bound(ForwardIter first, ForwardIter last,
                                    const T& value);
    template<class ForwardIter, class T, class Compare>
        ForwardIter upper_bound(ForwardIter first, ForwardIter last,
                                    const T& value, Compare comp);
 
    template<class ForwardIter, class T>
        pair<ForwardIter, ForwardIter>
        equal_range(ForwardIter first, ForwardIter last,
                    const T& value);
    template<class ForwardIter, class T, class Compare>
        pair<ForwardIter, ForwardIter>
        equal_range(ForwardIter first, ForwardIter last,
                    const T& value, Compare comp);
 
    template<class ForwardIter, class T>
        bool binary_search(ForwardIter first, ForwardIter last,
                           const T& value);
    template<class ForwardIter, class T, class Compare>
        bool binary_search(ForwardIter first, ForwardIter last,
                           const T& value, Compare comp);
 
    // слияние
    template<class InputIter1, class InputIter2, class OutputIter>
        OutputIter merge(InputIter1 first1, InputIter1 last1,
                             InputIter2 first2, InputIter2 last2,
                             OutputIter result);
    template<class InputIter1, class InputIter2, class OutputIter,
            class Compare>
        OutputIter merge(InputIter1 first1, InputIter1 last1,
                             InputIter2 first2, InputIter2 last2,
                             OutputIter result, Compare comp);
 
    template<class BidirectionalIter>
        void inplace_merge(BidirectionalIter first,
                           BidirectionalIter middle,
                           BidirectionalIter last);
    template<class BidirectionalIter, class Compare>
        void inplace_merge(BidirectionalIter first,
                           BidirectionalIter middle,
                           BidirectionalIter last, Compare comp);
 
    // операции над множествами
    template<class InputIter1, class InputIter2>
        bool includes(InputIter1 first1, InputIter1 last1,
                      InputIter2 first2, InputIter2 last2);
    template<class InputIter1, class InputIter2, class Compare>
        bool includes(
            InputIter1 first1, InputIter1 last1,
            InputIter2 first2, InputIter2 last2, Compare comp);
 
    template<class InputIter1, class InputIter2, class OutputIter>
        OutputIter set_union(InputIter1 first1, InputIter1 last1,
                                 InputIter2 first2, InputIter2 last2,
                                 OutputIter result);
    template<class InputIter1, class InputIter2, class OutputIter,
             class Compare>
        OutputIter set_union(InputIter1 first1, InputIter1 last1,
                                 InputIter2 first2, InputIter2 last2,
                                 OutputIter result, Compare comp);
 
    template<class InputIter1, class InputIter2, class OutputIter>
        OutputIter set_intersection(
            InputIter1 first1, InputIter1 last1,
            InputIter2 first2, InputIter2 last2,
            OutputIter result);
    template<class InputIter1, class InputIter2, class OutputIter,
             class Compare>
        OutputIter set_intersection(
            InputIter1 first1, InputIter1 last1,
            InputIter2 first2, InputIter2 last2,
            OutputIter result, Compare comp);
 
    template<class InputIter1, class InputIter2, class OutputIter>
        OutputIter set_difference(
            InputIter1 first1, InputIter1 last1,
            InputIter2 first2, InputIter2 last2,
            OutputIter result);
    template<class InputIter1, class InputIter2, class OutputIter,
             class Compare>
        OutputIter set_difference(
            InputIter1 first1, InputIter1 last1,
            InputIter2 first2, InputIter2 last2,
            OutputIter result, Compare comp);
 
    template<class InputIter1, class InputIter2, class OutputIter>
        OutputIter set_symmetric_difference(
            InputIter1 first1, InputIter1 last1,
            InputIter2 first2, InputIter2 last2,
            OutputIter result);
    template<class InputIter1, class InputIter2, class OutputIter,
             class Compare>
        OutputIter set_symmetric_difference(
            InputIter1 first1, InputIter1 last1,
            InputIter2 first2, InputIter2 last2,
            OutputIter result, Compare comp);
 
    // операции над кучей
    template<class RandomAccessIter>
        void push_heap(RandomAccessIter first, RandomAccessIter last);
    template<class RandomAccessIter, class Compare>
        void push_heap(RandomAccessIter first, RandomAccessIter last,
                       Compare comp);
    template<class RandomAccessIter>
        void pop_heap(RandomAccessIter first, RandomAccessIter last);
    template<class RandomAccessIter, class Compare>
        void pop_heap(RandomAccessIter first, RandomAccessIter last,
                      Compare comp);
 
    template<class RandomAccessIter>
        void make_heap(RandomAccessIter first, RandomAccessIter last);
    template<class RandomAccessIter, class Compare>
        void make_heap(RandomAccessIter first, RandomAccessIter last,
                       Compare comp);
 
    template<class RandomAccessIter>
        void sort_heap(RandomAccessIter first, RandomAccessIter last);
    template<class RandomAccessIter, class Compare>
        void sort_heap(RandomAccessIter first, RandomAccessIter last,
                       Compare comp);
 
    template<class RandomAccessIter>
        bool is_heap(RandomAccessIter first, RandomAccessIter last);
    template<class RandomAccessIter, class Compare>
        bool is_heap(RandomAccessIter first, RandomAccessIter last, Compare comp);
    template<class RandomAccessIter>
        RandomAccessIter
            is_heap_until(RandomAccessIter first, RandomAccessIter last);
    template<class RandomAccessIter, class Compare>
        RandomAccessIter
            is_heap_until(RandomAccessIter first, RandomAccessIter last,
                                           Compare comp);
 
    // минимум и максимум
    template<class T> const T& min(const T& a, const T& b);
    template<class T, class Compare>
        const T& min(const T& a, const T& b, Compare comp);
    template<class T>
        T min(initializer_list<T> t);
    template<class T, class Compare>
        T min(initializer_list<T> t, Compare comp);
 
    template<class T> const T& max(const T& a, const T& b);
    template<class T, class Compare>
        const T& max(const T& a, const T& b, Compare comp);
    template<class T>
        T max(initializer_list<T> t);
    template<class T, class Compare>
        T max(initializer_list<T> t, Compare comp);
 
    template<class T> pair<const T&, const T&> minmax(const T& a, const T& b);
    template<class T, class Compare>
        pair<const T&, const T&> minmax(const T& a, const T& b, Compare comp);
    template<class T>
        pair<T, T> minmax(initializer_list<T> t);
    template<class T, class Compare>
        pair<T, T> minmax(initializer_list<T> t, Compare comp);
 
    template<class ForwardIter>
        ForwardIter min_element(ForwardIter first, ForwardIter last);
    template<class ForwardIter, class Compare>
        ForwardIter min_element(ForwardIter first, ForwardIter last,
                                    Compare comp);
 
    template<class ForwardIter>
        ForwardIter max_element(ForwardIter first, ForwardIter last);
    template<class ForwardIter, class Compare>
        ForwardIter max_element(ForwardIter first, ForwardIter last,
                                    Compare comp);
 
    template<class ForwardIter>
        pair<ForwardIter, ForwardIter>
        minmax_element(ForwardIter first, ForwardIter last);
    template<class ForwardIter, class Compare>
        pair<ForwardIter, ForwardIter>
        minmax_element(ForwardIter first, ForwardIter last, Compare comp);
 
    template<class InputIter1, class InputIter2>
        bool lexicographical_compare(
            InputIter1 first1, InputIter1 last1,
            InputIter2 first2, InputIter2 last2);
    template<class InputIter1, class InputIter2, class Compare>
        bool lexicographical_compare(
            InputIter1 first1, InputIter1 last1,
            InputIter2 first2, InputIter2 last2,
            Compare comp);
 
    // перестановки
    template<class BidirectionalIter>
        bool next_permutation(BidirectionalIter first,
                              BidirectionalIter last);
    template<class BidirectionalIter, class Compare>
        bool next_permutation(BidirectionalIter first,
                              BidirectionalIter last, Compare comp);
 
    template<class BidirectionalIter>
        bool prev_permutation(BidirectionalIter first,
                              BidirectionalIter last);
    template<class BidirectionalIter, class Compare>
        bool prev_permutation(BidirectionalIter first,
                              BidirectionalIter last, Compare comp);
}