Namespaces
Variants

Библиотека алгоритмов

От ru.cppreference.net
< cpp
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы на диапазонах (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









 

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

Ограниченные алгоритмы (начиная с C++20)

C++20 предоставляет ограниченные версии большинства алгоритмов в пространстве имён std::ranges. В этих алгоритмах диапазон может быть задан либо как итератор-страж пара, либо как единый диапазон аргумент, также поддерживаются проекции и вызываемые объекты-указатели на члены. Кроме того, типы возвращаемых значений большинства алгоритмов были изменены, чтобы возвращать всю потенциально полезную информацию, вычисленную во время выполнения алгоритма.

std::vector<int> v{7, 1, 4, 0, -1};
std::ranges::sort(v); // constrained algorithm

Параллельные алгоритмы (начиная с C++17)

Параллельный алгоритм — это шаблон функции в библиотеке алгоритмов с параметром шаблона с именем ExecutionPolicy или ограниченным с помощью execution-policy (начиная с C++26). Такой параметр шаблона называется параметром шаблона политики выполнения ; он описывает способ, которым может быть распараллелено выполнение параллельного алгоритма.

Если не указано иное, параллельным алгоритмам разрешается делать произвольные копии элементов из диапазонов, при условии, что и std::is_trivially_copy_constructible_v<T>, и std::is_trivially_destructible_v<T> являются true, где T — это тип элементов.

Политики выполнения

Алгоритмы стандартной библиотеки поддерживают несколько политик выполнения, и библиотека предоставляет соответствующие типы политик выполнения и объекты. Пользователи могут статически выбирать политику выполнения, вызывая параллельный алгоритм с объектом политики выполнения соответствующего типа.

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

Определено в заголовке <execution>
Определено в пространстве имён std::execution
типы политик выполнения
(класс)
(C++17)(C++17)(C++17)(C++20)
глобальные объекты политик выполнения
(константа)
Определено в пространстве имён std
проверяет, представляет ли класс политику выполнения
(шаблон класса)
указывает, что тип представляет политику выполнения
(концепт, используемый только для пояснения*)

Немодифицирующие операции над последовательностями

Пакетные операции

Определён в заголовке <algorithm>
применяет унарный функциональный объект к элементам из диапазона
(шаблон функции & алгоритмический функциональный объект)
применяет функциональный объект к первым N элементам последовательности
(шаблон функции & алгоритмический функциональный объект)

Операции поиска

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

Сворачивающие операции (начиная с C++23)

Определено в заголовочном файле <algorithm>
левостороннее свертывание диапазона элементов
(объект-функция алгоритма)
левостороннее свертывание диапазона элементов с использованием первого элемента в качестве начального значения
(объект-функция алгоритма)
правостороннее свертывание диапазона элементов
(объект-функция алгоритма)
правостороннее свертывание диапазона элементов с использованием последнего элемента в качестве начального значения
(объект-функция алгоритма)
левостороннее свертывание диапазона элементов и возврат пары (итератор, значение)
(объект-функция алгоритма)
левостороннее свертывание диапазона элементов с использованием первого элемента в качестве начального значения и возврат пары (итератор, optional )
(объект-функция алгоритма)

Операции модификации последовательностей

Операции копирования

Определено в заголовке <algorithm>
копирует диапазон элементов в новое расположение
(шаблон функции & объект функции алгоритма)
(C++11)
копирует заданное количество элементов в новое расположение
(шаблон функции & объект функции алгоритма)
копирует диапазон элементов в обратном порядке
(шаблон функции & объект функции алгоритма)
(C++11)
перемещает диапазон элементов в новое расположение
(шаблон функции & объект функции алгоритма)
перемещает диапазон элементов в новое расположение в обратном порядке
(шаблон функции & объект функции алгоритма)

Операции обмена

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

Операции преобразования

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

Генерирующие операции

Определено в заголовке <algorithm>
присваивает копированием заданное значение каждому элементу в диапазоне
(шаблон функции & функциональный объект алгоритма)
присваивает копированием заданное значение N элементам в диапазоне
(шаблон функции & функциональный объект алгоритма)
присваивает результаты последовательных вызовов функции каждому элементу в диапазоне
(шаблон функции & функциональный объект алгоритма)
присваивает результаты последовательных вызовов функции N элементам в диапазоне
(шаблон функции & функциональный объект алгоритма)

Операции удаления

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

Операции изменения порядка

Определено в заголовке <algorithm>
изменяет порядок элементов в диапазоне на обратный
(шаблон функции & функциональный объект алгоритма)
создаёт копию диапазона с обратным порядком элементов
(шаблон функции & функциональный объект алгоритма)
выполняет циклический сдвиг порядка элементов в диапазоне
(шаблон функции & функциональный объект алгоритма)
копирует и выполняет циклический сдвиг диапазона элементов
(шаблон функции & функциональный объект алгоритма)
выполняет сдвиг элементов в диапазоне
(шаблон функции & функциональный объект алгоритма)
(до C++17)(C++11)
случайным образом переупорядочивает элементы в диапазоне
(шаблон функции & функциональный объект алгоритма)

Операции выборки

Определён в заголовке <algorithm>
(C++17)
выбирает N случайных элементов из последовательности
(шаблон функции & функциональный объект алгоритма)

Сортировка и связанные операции

Требования

Некоторые алгоритмы требуют, чтобы последовательность, представленная аргументами, была «отсортирована» или «разделена». Поведение не определено, если это требование не выполнено.

Последовательность отсортирована относительно компаратора comp если для каждого итератора iter, указывающего на последовательность, и каждого неотрицательного целого числа n такого, что iter + n[1] является допустимым итератором, указывающим на элемент последовательности, comp(*(iter + n), *iter) == false[1].

(до C++20)

Последовательность отсортирована относительно comp и proj для компаратора comp и проекции proj если для каждого итератора iter, указывающего на последовательность, и каждого неотрицательного целого числа n такого, что iter + n[1] является допустимым итератором, указывающим на элемент последовательности, bool(std::invoke(comp, std::invoke(proj, *(iter + n)),
                       std::invoke(proj, *iter)))
[1] является false.

Последовательность отсортирована относительно компаратора comp если последовательность отсортирована относительно comp и std::identity{} (тождественная проекция).

(начиная с C++20)

Последовательность [startfinish) является разделённой относительно выражения f(e) если существует целое число n такое, что для всех i в [0std::distance(start, finish)), f(*(start + i))[1] является true тогда и только тогда, когда i < n.

  1. 1.0 1.1 1.2 1.3 1.4 iter + n просто означает «результат iter, увеличенного на n раз», независимо от того, является ли iter итератором произвольного доступа.

Операции разделения

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

Операции сортировки

Определено в заголовке <algorithm>
сортирует диапазон элементов
(шаблон функции & функциональный объект алгоритма)
сортирует диапазон элементов, сохраняя относительный порядок эквивалентных элементов
(шаблон функции & функциональный объект алгоритма)
сортирует первые N элементов диапазона
(шаблон функции & функциональный объект алгоритма)
копирует и частично сортирует диапазон элементов
(шаблон функции & функциональный объект алгоритма)
(C++11)
проверяет, отсортирован ли диапазон
(шаблон функции & функциональный объект алгоритма)
находит наибольший отсортированный поддиапазон
(шаблон функции & функциональный объект алгоритма)
находит N-й элемент, если бы диапазон был отсортирован
(шаблон функции & функциональный объект алгоритма)

Операции бинарного поиска (на разбитых диапазонах)

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

Операции над множествами (на отсортированных диапазонах)

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

Операции слияния (на отсортированных диапазонах)

Определено в заголовке <algorithm>
объединяет два отсортированных диапазона
(шаблон функции & функциональный объект алгоритма)
объединяет два упорядоченных диапазона на месте
(шаблон функции & функциональный объект алгоритма)

Операции с кучей

Произвольный доступ диапазон [firstlast) является кучей относительно компаратора comp, если bool(comp(first[(i - 1) / 2], first[i])) является false для всех целых i в (0last - first).

(до C++20)

Произвольный доступ диапазон [firstlast) является кучей относительно comp и proj для компаратора comp и проекции proj, если bool(std::invoke(comp, std::invoke(proj, first[(i - 1) / 2]),
                       std::invoke(proj, first[i]))
является false для всех целых i в (0last - first).

Диапазон с произвольным доступом [firstlast) является кучей относительно компаратора comp, если диапазон является кучей относительно comp и std::identity{} (проекция идентичности).

(начиная с C++20)

Куча может быть создана с помощью std::make_heap и ranges::make_heap(начиная с C++20).

Для получения дополнительной информации о куче см. максимальная куча.


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

Операции минимума/максимума

Определено в заголовочном файле <algorithm>
возвращает большее из заданных значений
(шаблон функции & функциональный объект алгоритма)
возвращает наибольший элемент в диапазоне
(шаблон функции & функциональный объект алгоритма)
возвращает меньшее из заданных значений
(шаблон функции & функциональный объект алгоритма)
возвращает наименьший элемент в диапазоне
(шаблон функции & функциональный объект алгоритма)
(C++11)
возвращает меньшее и большее из двух элементов
(шаблон функции & функциональный объект алгоритма)
возвращает наименьший и наибольший элементы в диапазоне
(шаблон функции & функциональный объект алгоритма)
(C++17)
зажимает значение между парой граничных значений
(шаблон функции & функциональный объект алгоритма)

Операции лексикографического сравнения

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

Операции перестановки

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

Числовые операции

Определено в заголовке <numeric>
(C++11)
заполняет диапазон последовательными приращениями начального значения
(шаблон функции & алгоритм функциональный объект)
суммирует или свёртывает диапазон элементов
(шаблон функции)
вычисляет внутреннее произведение двух диапазонов элементов
(шаблон функции)
вычисляет разности между соседними элементами в диапазоне
(шаблон функции)
вычисляет частичную сумму диапазона элементов
(шаблон функции)
(C++17)
аналогична std::accumulate, за исключением неупорядоченного выполнения
(шаблон функции)
аналогична std::partial_sum, исключает i входной элемент из i суммы
(шаблон функции)
аналогична std::partial_sum, включает i входной элемент в i сумму
(шаблон функции)
применяет вызываемый объект, затем выполняет неупорядоченную редукцию
(шаблон функции)
применяет вызываемый объект, затем вычисляет эксклюзивное сканирование
(шаблон функции)
применяет вызываемый объект, затем вычисляет инклюзивное сканирование
(шаблон функции)

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

Специализированные <random>алгоритмы (начиная с C++26)

Определено в заголовке <random>
заполняет диапазон случайными числами из генератора равномерных случайных битов
(функциональный объект алгоритма)

Примечания

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_algorithm_iterator_requirements 202207L (C++23) Итераторы диапазонов как входные данные для алгоритмов не-диапазонов
__cpp_lib_clamp 201603L (C++17) std::clamp
__cpp_lib_constexpr_algorithms 201806L (C++20) Constexpr для алгоритмов
202306L (C++26) Constexpr стабильная сортировка
__cpp_lib_algorithm_default_value_type 202403L (C++26) Списковая инициализация для алгоритмов
__cpp_lib_freestanding_algorithm 202311L (C++26) Автономные средства в <algorithm>
__cpp_lib_robust_nonmodifying_seq_ops 201304L (C++14) Повышение надежности немодифицирующих последовательных операций (перегрузки для двух диапазонов std::mismatch , std::equal и std::is_permutation)
__cpp_lib_sample 201603L (C++17) std::sample
__cpp_lib_shift 201806L (C++20) std::shift_left и std::shift_right

Библиотека C

Определено в заголовочном файле <cstdlib>
сортирует диапазон элементов с неуказанным типом
(функция)
выполняет поиск элемента с неуказанным типом в массиве
(функция)

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

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

DR Applied to Behavior as published Correct behavior
LWG 193 C++98 heap required * first to be the largest element there can be elements
equal to * first
LWG 2150 C++98 the definition of a sorted sequence was incorrect corrected
LWG 2166 C++98 the heap requirement did not match the
definition of max heap closely enough
requirement improved

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

C documentation для Algorithms