Ограниченные алгоритмы(начиная с C++20)
C++20 предоставляет ограниченные версии большинства алгоритмов в пространстве имён std::ranges. В этих алгоритмах диапазон может быть задан либо как пара итератор-страж, либо как единственный аргумент диапазон, и поддерживаются проекции и вызываемые объекты-указатели на член. Кроме того, типы возврата большинства алгоритмов были изменены, чтобы возвращать всю потенциально полезную информацию, вычисленную во время выполнения алгоритма.
Объекты функций алгоритмов
Алгоритмический функциональный объект (AFO), неформально известный как niebloid , представляет собой объект точки настройки (CPO), который задан как одна или несколько перегруженных шаблонов функций. Имя этих шаблонов функций обозначает соответствующий алгоритмический функциональный объект.
Для алгоритмического функционального объекта o пусть S будет соответствующим набором шаблонов функций. Тогда для любой последовательности аргументов args... o(args...) является выражение-эквивалентным s(args...), где результатом поиска имени для s является набор перегрузок S.
Ограниченные алгоритмы в пространстве имён std::ranges определены как алгоритмические функциональные объекты. В результате:
- Явные списки аргументов шаблона не могут быть указаны при вызове любого из них.
- Ни один из них не видим для поиска, зависящего от аргументов.
- Когда любой из них найден обычным неквалифицированным поиском как имя слева от оператора вызова функции, поиск, зависящий от аргументов подавляется.
Параметры диапазонов
Некоторые перегрузки принимают аргументы-диапазоны, они ведут себя так, как если бы были реализованы путём передачи соответствующей перегрузке в пространстве имён ranges, которая принимает отдельные аргументы итератора и ограничителя, где для каждого аргумента-диапазона r:
- Соответствующий аргумент итератора инициализируется с помощью
ranges::begin(r).
|
(до C++26) |
|
(начиная с C++26) |
Немодифицирующие операции с последовательностями
Определено в заголовочном файле
<algorithm> | |
Определено в пространстве имен
std::ranges | |
Пакетные операции | |
(C++20) |
применяет унарный функциональный объект к элементам из диапазона (алгоритмический функциональный объект) |
(C++20) |
применяет функциональный объект к первым N элементам последовательности (алгоритмический функциональный объект) |
Операции поиска | |
(C++20)(C++20)(C++20) |
проверяет, выполняется ли предикат true для всех, любого или ни одного из элементов диапазона(объект-функция алгоритма) |
(C++23)(C++23) |
проверяет, содержит ли диапазон данный элемент или поддиапазон (объект-функция алгоритма) |
(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) |
выполняет левую свёртку диапазона элементов (алгоритмический объект функции) |
(C++23) |
выполняет левую свёртку диапазона элементов, используя первый элемент в качестве начального значения (алгоритмический объект функции) |
(C++23) |
выполняет правую свёртку диапазона элементов (алгоритмический объект функции) |
(C++23) |
выполняет правую свёртку диапазона элементов, используя последний элемент в качестве начального значения (алгоритмический объект функции) |
(C++23) |
выполняет левую свёртку диапазона элементов и возвращает pair (итератор, значение) (алгоритмический объект функции) |
| выполняет левую свёртку диапазона элементов, используя первый элемент в качестве начального значения, и возвращает pair (итератор, optional) (алгоритмический объект функции) | |
Изменяющие операции последовательности
Определено в заголовочном файле
<algorithm> | |
Определено в пространстве имён
std::ranges | |
Операции копирования | |
(C++20)(C++20) |
копирует диапазон элементов в новое место (объект функции алгоритма) |
(C++20) |
копирует некоторое количество элементов в новое место (объект функции алгоритма) |
(C++20) |
копирует диапазон элементов в обратном порядке (объект функции алгоритма) |
(C++20) |
перемещает диапазон элементов в новое место (объект функции алгоритма) |
(C++20) |
перемещает диапазон элементов в новое место в обратном порядке (объект функции алгоритма) |
Операции обмена | |
(C++20) |
меняет местами два диапазона элементов (объект функции алгоритма) |
Операции преобразования | |
(C++20) |
применяет функцию к диапазону элементов (алгоритмический объект-функция) |
(C++20)(C++20) |
заменяет все значения, удовлетворяющие определённым критериям, другим значением (алгоритмический объект-функция) |
(C++20)(C++20) |
копирует диапазон, заменяя элементы, удовлетворяющие определённым критериям, другим значением (алгоритмический объект-функция) |
Операции генерации | |
(C++20) |
присваивает диапазону элементов определённое значение (алгоритмический функциональный объект) |
(C++20) |
присваивает значение заданному количеству элементов (алгоритмический функциональный объект) |
(C++20) |
сохраняет результат функции в диапазоне (алгоритмический функциональный объект) |
(C++20) |
сохраняет результат N применений функции (алгоритмический функциональный объект) |
Операции удаления | |
(C++20)(C++20) |
удаляет элементы, удовлетворяющие определённым критериям (объект функции алгоритма) |
(C++20)(C++20) |
копирует диапазон элементов, пропуская те, которые удовлетворяют определённым критериям (объект функции алгоритма) |
(C++20) |
удаляет последовательные повторяющиеся элементы в диапазоне (объект функции алгоритма) |
(C++20) |
создаёт копию некоторого диапазона элементов, не содержащую последовательных дубликатов (объект функции алгоритма) |
Операции изменения порядка | |
(C++20) |
изменяет порядок элементов в диапазоне на обратный (функциональный объект алгоритма) |
(C++20) |
создаёт копию диапазона с обратным порядком элементов (функциональный объект алгоритма) |
(C++20) |
выполняет циклический сдвиг элементов в диапазоне (функциональный объект алгоритма) |
(C++20) |
копирует и циклически сдвигает элементы диапазона (функциональный объект алгоритма) |
(C++23)(C++23) |
сдвигает элементы в диапазоне (функциональный объект алгоритма) |
(C++20) |
случайным образом переупорядочивает элементы в диапазоне (функциональный объект алгоритма) |
Операции выборки | |
(C++20) |
выбирает N случайных элементов из последовательности (объект-функция алгоритма) |
Определено в заголовке
<algorithm> | |
Определено в пространстве имён
std::ranges | |
Операции разделения | |
(C++20) |
определяет, разделён ли диапазон заданным предикатом (объект-функция алгоритма) |
(C++20) |
разделяет диапазон элементов на две группы (объект-функция алгоритма) |
(C++20) |
копирует диапазон, разделяя элементы на две группы (объект-функция алгоритма) |
(C++20) |
разделяет элементы на две группы, сохраняя их относительный порядок внутри каждой группы (объект-функция алгоритма) |
(C++20) |
находит точку разбиения разделённого диапазона (объект-функция алгоритма) |
Операции сортировки | |
(C++20) |
проверяет, отсортирован ли диапазон (объект функции алгоритма) |
(C++20) |
находит наибольший отсортированный поддиапазон (объект функции алгоритма) |
(C++20) |
сортирует диапазон элементов (объект функции алгоритма) |
(C++20) |
сортирует первые N элементов диапазона (объект функции алгоритма) |
(C++20) |
копирует и частично сортирует диапазон элементов (объект функции алгоритма) |
(C++20) |
сортирует диапазон элементов, сохраняя относительный порядок эквивалентных элементов (объект функции алгоритма) |
(C++20) |
находит N-й элемент, если бы диапазон был отсортирован (объект функции алгоритма) |
Операции двоичного поиска (по отсортированным диапазонам) | |
(C++20) |
находит первый элемент, не меньший заданного значения, используя двоичный поиск (объект функции алгоритма) |
(C++20) |
находит первый элемент, больший заданного значения, используя двоичный поиск (объект функции алгоритма) |
(C++20) |
определяет, существует ли элемент в диапазоне, используя двоичный поиск (объект функции алгоритма) |
(C++20) |
находит диапазон элементов, соответствующих заданному значению, используя двоичный поиск (объект функции алгоритма) |
Операции над множествами (на отсортированных диапазонах) | |
(C++20) |
определяет, является ли одна последовательность подпоследовательностью другой (функциональный объект алгоритма) |
(C++20) |
вычисляет разность двух множеств (функциональный объект алгоритма) |
(C++20) |
вычисляет пересечение двух множеств (функциональный объект алгоритма) |
| вычисляет симметрическую разность двух множеств (функциональный объект алгоритма) | |
(C++20) |
вычисляет объединение двух множеств (функциональный объект алгоритма) |
Операции слияния (для отсортированных диапазонов) | |
(C++20) |
сливает два отсортированных диапазона (объект функции алгоритма) |
(C++20) |
сливает два упорядоченных диапазона на месте (объект функции алгоритма) |
Операции с кучей | |
(C++20) |
проверяет, является ли заданный диапазон максимальной кучей (объект алгоритмической функции) |
(C++20) |
находит наибольший поддиапазон, являющийся максимальной кучей (объект алгоритмической функции) |
(C++20) |
создаёт максимальную кучу из диапазона элементов (объект алгоритмической функции) |
(C++20) |
добавляет элемент в максимальную кучу (объект алгоритмической функции) |
(C++20) |
удаляет наибольший элемент из максимальной кучи (объект алгоритмической функции) |
(C++20) |
преобразует максимальную кучу в отсортированный диапазон элементов (объект алгоритмической функции) |
Операции минимума/максимума |
|
|
(C++20)
|
возвращает наибольшее из заданных значений
(функциональный объект алгоритма) |
|
(C++20)
|
возвращает наибольший элемент в диапазоне
(функциональный объект алгоритма) |
|
(C++20)
|
возвращает наименьшее из заданных значений
(функциональный объект алгоритма) |
|
(C++20)
|
возвращает наименьший элемент в диапазоне
(функциональный объект алгоритма) |
|
(C++20)
|
возвращает меньший и больший из двух элементов
(функциональный объект алгоритма) |
|
(C++20)
|
возвращает наименьший и наибольший элементы в диапазоне
(функциональный объект алгоритма) |
|
(C++20)
|
ограничивает значение между парой граничных значений
(функциональный объект алгоритма) |
Операции лексикографического сравнения | |
| сравнивает два диапазона лексикографически (функциональный объект алгоритма) | |
Операции перестановки |
|
|
(C++20)
|
определяет, является ли последовательность перестановкой другой последовательности
(функциональный объект алгоритма) |
|
(C++20)
|
генерирует следующую большую лексикографическую перестановку диапазона элементов
(функциональный объект алгоритма) |
|
(C++20)
|
генерирует следующую меньшую лексикографическую перестановку диапазона элементов
(функциональный объект алгоритма) |
Числовые операции
Определено в заголовочном файле
<numeric> | |
Определено в пространстве имён
std::ranges | |
(C++23) |
заполняет диапазон последовательными приращениями начального значения (алгоритмический функциональный объект) |
Специализированные <memory>алгоритмы
Определено в заголовке
<memory> | |
Определено в пространстве имён
std::ranges | |
Конструирование объектов (пакетное) | |
(C++20) |
создаёт объект по заданному адресу (объект функции алгоритма) |
(C++20) |
копирует диапазон объектов в неинициализированную область памяти (объект функции алгоритма) |
(C++20) |
копирует заданное количество объектов в неинициализированную область памяти (объект функции алгоритма) |
(C++20) |
копирует объект в неинициализированную область памяти, определяемую диапазоном (объект функции алгоритма) |
(C++20) |
копирует объект в неинициализированную область памяти, определяемую началом и количеством (объект функции алгоритма) |
(C++20) |
перемещает диапазон объектов в неинициализированную область памяти (объект функции алгоритма) |
(C++20) |
перемещает заданное количество объектов в неинициализированную область памяти (объект функции алгоритма) |
| конструирует объекты через инициализацию по умолчанию в неинициализированной области памяти, определяемой диапазоном (объект функции алгоритма) | |
| конструирует объекты через инициализацию по умолчанию в неинициализированной области памяти, определяемой началом и количеством (объект функции алгоритма) | |
| конструирует объекты через инициализацию значением в неинициализированной области памяти, определяемой диапазоном (объект функции алгоритма) | |
| конструирует объекты через инициализацию значением в неинициализированной области памяти, определяемой началом и количеством (объект функции алгоритма) | |
Пакетное уничтожение объектов | |
(C++20) |
уничтожает диапазон объектов (объект функции алгоритма) |
(C++20) |
уничтожает несколько объектов в диапазоне (объект функции алгоритма) |
(C++20) |
уничтожает объект по заданному адресу (объект функции алгоритма) |
Специализированные <random> алгоритмы
Определено в заголовочном файле
<random> | |
Определено в пространстве имён
std::ranges | |
(C++26) |
заполняет диапазон случайными числами из равномерного генератора случайных битов (функциональный объект алгоритма) |
Типы возвращаемых значений
|
Определено в заголовочном файле
<algorithm>
|
|
|
Определено в пространстве имен
std::ranges
|
|
|
(C++20)
|
предоставляет способ хранить итератор и функциональный объект как единое целое
(шаблон класса) |
|
(C++20)
|
предоставляет способ хранить два итератора как единое целое
(шаблон класса) |
|
(C++20)
|
предоставляет способ хранить два итератора как единое целое
(шаблон класса) |
|
(C++20)
|
предоставляет способ хранить три итератора как единое целое
(шаблон класса) |
|
(C++20)
|
предоставляет способ хранить три итератора как единое целое
(шаблон класса) |
|
(C++20)
|
предоставляет способ хранить два объекта или ссылки одного типа как единое целое
(шаблон класса) |
|
(C++20)
|
предоставляет способ хранить итератор и логический флаг как единое целое
(шаблон класса) |
|
(C++23)
|
предоставляет способ хранить итератор и значение как единое целое
(шаблон класса) |
|
(C++23)
|
предоставляет способ хранить итератор и значение как единое целое
(шаблон класса) |
Примечания
| Макрос тестирования возможности | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type |
202403L |
(C++26) | Списочная инициализация для алгоритмов |
__cpp_lib_parallel_algorithm |
202506L |
(C++26) | Параллельные диапазонные алгоритмы |
__cpp_lib_ranges |
201911L |
(C++20) | Библиотека диапазонов и ограниченные алгоритмы |
__cpp_lib_ranges_contains |
202207L |
(C++23) | std::ranges::contains |
__cpp_lib_ranges_find_last |
202207L |
(C++23) | std::ranges::find_last |
__cpp_lib_ranges_fold |
202207L |
(C++23) | std::ranges алгоритмы свёртки
|
__cpp_lib_ranges_iota |
202202L |
(C++23) | std::ranges::iota |
__cpp_lib_ranges_starts_ends_with |
202106L |
(C++23) | std::ranges::starts_with, std::ranges::ends_with |
__cpp_lib_shift |
201806L |
(C++20) | std::shift_left, std::shift_right |
202202L |
(C++23) | std::ranges::shift_left, std::ranges::shift_right | |
__cpp_lib_ranges_generate_random |
202403L |
(C++26) | std::ranges::generate_random |
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, опубликованное как | Корректное поведение |
|---|---|---|---|
| P3136R1 | C++20 | niebloids могли быть определены как особые сущности, отличные от функциональных объектов |
требовалось указывать как функциональные объекты |