Библиотека алгоритмов
Библиотека алгоритмов определяет функции для различных целей (например, поиск, сортировка, подсчёт, обработка), работающие с диапазонами элементов.
Ограниченные алгоритмы (начиная с C++20)
C++20 предоставляет ограниченные версии большинства алгоритмов в пространстве имён std::ranges. В этих алгоритмах диапазон можно задать либо парой итератор–сентинел, либо одним аргументом range; также поддерживаются проекции и вызываемые объекты — указатели на члены. Кроме того, типы возвращаемых значений большинства алгоритмов изменены так, чтобы возвращать всю потенциально полезную информацию, вычисленную во время выполнения алгоритма.
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) | типы политик выполнения (класс) |
|
(C++17)(C++17)(C++17)(C++20) | глобальные объекты политик выполнения (константа) |
Определено в пространстве имён std |
|
|
(C++17) | проверяет, представляет ли класс политику выполнения (шаблон класса) |
|
(C++26) | указывает, что тип представляет политику выполнения (понятие только для описания*) |
Немодифицирующие операции над последовательностями
Пакетные операции
Определено в заголовке <algorithm> |
|
|---|---|
| применяет унарный функциональный объект к элементам диапазона (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
|
(C++17) | применяет функциональный объект к первым N элементам последовательности (шаблон функции и функциональный объект-алгоритм) |
|
(C++20) | |
Операции поиска
Определено в заголовке <algorithm> |
|
|---|---|
|
(C++11)(C++11)(C++11) | проверяют, true ли предикат для всех, любого или ни одного из элементов диапазона(шаблон функции и функциональный объект-алгоритм) |
|
(C++20)(C++20)(C++20) | |
|
(C++23)(C++23) | проверяют, содержит ли диапазон заданный элемент или поддиапазон (функциональный объект-алгоритм) |
|
(C++11) | находят первый элемент, удовлетворяющий заданным критериям (шаблон функции и функциональный объект-алгоритм) |
|
(C++20)(C++20)(C++20) | |
|
(C++23)(C++23)(C++23) | находят последний элемент, удовлетворяющий заданным критериям (функциональный объект-алгоритм) |
| находит последнюю последовательность элементов в заданном диапазоне (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
| ищет любой из элементов заданного набора (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
| находит первые два соседних элемента, которые равны друг другу (или удовлетворяют заданному предикату) (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
| возвращают количество элементов, удовлетворяющих заданным критериям (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20)(C++20) | |
| находит первую позицию, в которой два диапазона различаются (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
| определяет, совпадают ли два набора элементов (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
| ищет первое вхождение последовательности элементов (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
| ищет первое вхождение в диапазоне заданного количества последовательных копий элемента (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
|
(C++23) | проверяет, начинается ли диапазон с другого диапазона (функциональный объект-алгоритм) |
|
(C++23) | проверяет, заканчивается ли диапазон другим диапазоном (функциональный объект-алгоритм) |
Операции свёртки (начиная с C++23)
Определено в заголовке <algorithm> |
|
|---|---|
|
(C++23)(C++23) | указывает, что вызываемый тип можно использовать в алгоритмах свёртки (понятие только для описания*) |
|
(C++23) | выполняет свёртку диапазона элементов слева направо (функциональный объект-алгоритм) |
|
(C++23) | выполняет свёртку диапазона элементов слева направо, используя первый элемент в качестве начального значения (функциональный объект-алгоритм) |
|
(C++23) | выполняет свёртку диапазона элементов справа налево (функциональный объект-алгоритм) |
|
(C++23) | выполняет свёртку диапазона элементов справа налево, используя последний элемент в качестве начального значения (функциональный объект-алгоритм) |
|
(C++23) | выполняет свёртку диапазона элементов слева направо и возвращает пару (итератор, значение) (функциональный объект-алгоритм) |
|
(C++23) | выполняет свёртку диапазона элементов слева направо, используя первый элемент в качестве начального значения, и возвращает пару (итератор, optional) (функциональный объект-алгоритм) |
Модифицирующие операции над последовательностями
Операции копирования
Определено в заголовке <algorithm> |
|
|---|---|
|
(C++11) | копирует диапазон элементов в новое место (шаблон функции и функциональный объект-алгоритм) |
|
(C++20)(C++20) | |
|
(C++11) | копирует заданное количество элементов в новое место (шаблон функции и функциональный объект-алгоритм) |
|
(C++20) | |
| копирует диапазон элементов в обратном порядке (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
|
(C++11) | перемещает диапазон элементов в новое место (шаблон функции и функциональный объект-алгоритм) |
|
(C++20) | |
|
(C++11) | перемещает диапазон элементов в новое место в обратном порядке (шаблон функции и функциональный объект-алгоритм) |
|
(C++20) | |
Операции обмена
Определено в заголовке <algorithm> (до C++11) |
|
|---|---|
Определено в заголовке <utility> (начиная с C++11) |
|
Определено в заголовке <string_view> |
|
| обменивает значения двух объектов (шаблон функции) |
|
Определено в заголовке <algorithm> |
|
| обменивает два диапазона элементов (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
| обменивает элементы, на которые указывают два итератора (шаблон функции) |
|
Операции преобразования
Определено в заголовке <algorithm> |
|
|---|---|
| применяет функцию к диапазону элементов, сохраняя результаты в целевом диапазоне (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
| заменяет все значения, удовлетворяющие заданным критериям, другим значением (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20)(C++20) | |
| копирует диапазон, заменяя элементы, удовлетворяющие заданным критериям, другим значением (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20)(C++20) | |
Операции генерации
Определено в заголовке <algorithm> |
|
|---|---|
| присваивает заданное значение каждому элементу диапазона посредством копирующего присваивания (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
| присваивает заданное значение N элементам диапазона посредством копирующего присваивания (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
| присваивает каждому элементу диапазона результаты последовательных вызовов функции (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
| присваивает N элементам диапазона результаты последовательных вызовов функции (шаблон функции и функциональный объект-алгоритм) |
|
|
(C++20) | |
Операции удаления
Определено в заголовке <algorithm> |
|
|---|---|
| удаляет элементы, удовлетворяющие заданным критериям (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20)(C++20) | |
| копирует диапазон элементов, пропуская те, которые удовлетворяют заданным критериям (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20)(C++20) | |
| удаляет последовательные повторяющиеся элементы в диапазоне (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| создаёт копию части диапазона элементов без последовательных повторений (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
Операции изменения порядка
Определено в заголовке <algorithm> |
|
|---|---|
| изменяет порядок элементов в диапазоне на обратный (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| создаёт копию диапазона в обратном порядке (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| циклически сдвигает порядок элементов в диапазоне (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| копирует и циклически сдвигает диапазон элементов (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
|
(C++20)(C++20) | сдвигает элементы в диапазоне (шаблон функции и функциональный объект алгоритма) |
|
(C++23)(C++23) | |
|
(до C++17)(C++11) | случайным образом переставляет элементы в диапазоне (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
Операции выборки
Определено в заголовке <algorithm> |
|
|---|---|
|
(C++17) | выбирает N случайных элементов из последовательности (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
Сортировка и связанные операции
Требования
Некоторые алгоритмы требуют, чтобы последовательность, представленная аргументами, была «отсортирована» или «разбита на разделы». Если это требование не выполнено, поведение не определено.
| Последовательность является отсортированной относительно компаратора | (до C++20) |
| Последовательность является отсортированной относительно Последовательность является отсортированной относительно компаратора | (начиная с C++20) |
Последовательность [start, finish) является разбитой на разделы относительно выражения f(e), если существует целое число n такое, что для всех i в [0, std::distance(start, finish)), f(*(start + i))[1] является true тогда и только тогда, когда i < n.
-
iter + nозначает просто «результат увеличенияiterнаn», независимо от того, является лиiterитератором произвольного доступа.
Операции разбиения на разделы
Определено в заголовке <algorithm> |
|
|---|---|
|
(C++11) | определяет, разбит ли диапазон на разделы с помощью заданного предиката (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
| разделяет диапазон элементов на две группы (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
|
(C++11) | копирует диапазон, распределяя элементы по двум группам (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
| разделяет элементы на две группы, сохраняя их относительный порядок внутри каждой группы (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
|
(C++11) | находит точку разделения в диапазоне, разбитом на разделы (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
Операции сортировки
Определено в заголовке <algorithm> |
|
|---|---|
| сортирует диапазон элементов (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| сортирует диапазон элементов, сохраняя относительный порядок эквивалентных элементов (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| сортирует первые N элементов диапазона (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| копирует и частично сортирует диапазон элементов (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
|
(C++11) | проверяет, отсортирован ли диапазон (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
|
(C++11) | находит наибольший отсортированный поддиапазон (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
| находит N-й элемент, который находился бы на этой позиции после сортировки диапазона (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
Операции бинарного поиска (в диапазонах, разбитых на разделы)
Определено в заголовке <algorithm> |
|
|---|---|
| с помощью бинарного поиска находит первый элемент, не меньший заданного значения (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| с помощью бинарного поиска находит первый элемент, больший заданного значения (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| с помощью бинарного поиска находит диапазон элементов, равных заданному значению (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| с помощью бинарного поиска определяет, существует ли элемент в диапазоне (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
Операции над множествами (в отсортированных диапазонах)
Определено в заголовке <algorithm> |
|
|---|---|
| определяет, является ли одна последовательность подпоследовательностью другой (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| вычисляет объединение двух множеств (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| вычисляет пересечение двух множеств (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| вычисляет разность двух множеств (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| вычисляет симметрическую разность двух множеств (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
Операции слияния (в отсортированных диапазонах)
Определено в заголовке <algorithm> |
|
|---|---|
| сливает два отсортированных диапазона (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| выполняет слияние двух упорядоченных диапазонов на месте (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
Операции с кучей
| Диапазон | (до C++20) |
| Диапазон Диапазон | (начиная с C++20) |
Кучу можно создать с помощью std::make_heap и ranges::make_heap(начиная с C++20).
Подробнее о свойствах кучи см. в статье максимальная куча.
Определён в заголовке <algorithm> |
|
|---|---|
| добавляет элемент в максимальную кучу (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| удаляет наибольший элемент из максимальной кучи (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| создаёт максимальную кучу из диапазона элементов (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| преобразует максимальную кучу в диапазон элементов, отсортированных по возрастанию (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
|
(C++11) | проверяет, является ли заданный диапазон максимальной кучей (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
|
(C++11) | находит наибольший поддиапазон, являющийся максимальной кучей (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
Операции нахождения минимума и максимума
Определён в заголовке <algorithm> |
|
|---|---|
| возвращает большее из заданных значений (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| возвращает наибольший элемент диапазона (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| возвращает меньшее из заданных значений (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| возвращает наименьший элемент диапазона (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
|
(C++11) | возвращает меньший и больший из двух элементов (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
|
(C++11) | возвращает наименьший и наибольший элементы диапазона (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
|
(C++17) | ограничивает значение заданными граничными значениями (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
Операции лексикографического сравнения
Определён в заголовке <algorithm> |
|
|---|---|
| лексикографически сравнивает два диапазона (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
|
(C++20) | сравнивает два диапазона с помощью трёхстороннего сравнения (шаблон функции) |
Операции перестановок
Определён в заголовке <algorithm> |
|
|---|---|
| создаёт следующую лексикографически большую перестановку элементов диапазона (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| создаёт следующую лексикографически меньшую перестановку элементов диапазона (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
|
(C++11) | определяет, является ли последовательность перестановкой другой последовательности (шаблон функции и функциональный объект алгоритма) |
|
(C++20) | |
Числовые операции
Определён в заголовке <numeric> |
|
|---|---|
|
(C++11) | заполняет диапазон последовательными приращениями начального значения (шаблон функции и функциональный объект алгоритма) |
|
(C++23) | |
| суммирует или свёртывает диапазон элементов (шаблон функции) |
|
| вычисляет скалярное произведение двух диапазонов элементов (шаблон функции) |
|
| вычисляет разности между соседними элементами диапазона (шаблон функции) |
|
| вычисляет частичные суммы диапазона элементов (шаблон функции) |
|
|
(C++17) | аналогичен std::accumulate, но вычисления могут выполняться не по порядку (шаблон функции) |
|
(C++17) | аналогичен std::partial_sum, но исключает i-й входной элемент из i-й суммы (шаблон функции) |
|
(C++17) | аналогичен std::partial_sum, но включает i-й входной элемент в i-ю сумму (шаблон функции) |
|
(C++17) | применяет вызываемый объект, а затем выполняет свёртку без гарантии порядка (шаблон функции) |
|
(C++17) | применяет вызываемый объект, а затем вычисляет исключительное сканирование (шаблон функции) |
|
(C++17) | применяет вызываемый объект, а затем вычисляет включительное сканирование (шаблон функции) |
Специализированные алгоритмы <memory>
Специализированные алгоритмы <random> (начиная с C++26)
Определён в заголовке <random> |
|
|---|---|
|
(C++26) | заполняет диапазон случайными числами, полученными от генератора равномерно распределённых случайных битов (функциональный объект алгоритма) |
Примечания
| Макрос проверки поддержки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type | 202403L | (C++26) | Инициализация списком в алгоритмах |
__cpp_lib_algorithm_iterator_requirements | 202207L | (C++23) | Итераторы ranges в качестве входных данных для алгоритмов, не относящихся к ranges |
__cpp_lib_clamp | 201603L | (C++17) |
std::clamp |
__cpp_lib_constexpr_algorithms | 201806L | (C++20) | Constexpr для алгоритмов |
202306L | (C++26) | Стабильная сортировка constexpr | |
__cpp_lib_execution | 201603L | (C++17) | Политики выполнения |
201902L | (C++20) |
std::execution::unsequenced_policy |
|
__cpp_lib_freestanding_algorithm | 202311L | (C++26) | Средства для freestanding-сред в <algorithm> |
__cpp_lib_parallel_algorithm | 201603L | (C++17) | Параллельные алгоритмы |
202506L | (C++26) | Параллельные алгоритмы диапазонов | |
__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 | Применяется к | Опубликованное поведение | Исправленное поведение |
|---|---|---|---|
| LWG 193 | C++98 | требовалось, чтобы *first был наибольшим элементом кучи | могут существовать элементы, равные *first |
| LWG 2150 | C++98 | определение отсортированной последовательности было неверным | исправлено |
| LWG 2166 | C++98 | требование к куче недостаточно точно соответствовало определению максимальной кучи | требование улучшено |
См. также
| Документация по C для алгоритмов |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm