Ограниченные алгоритмы (начиная с C++20)
Материал из cppreference.com
C++20 предоставляет ограниченные версии большинства алгоритмов в пространстве имён std::ranges
. В этих алгоритмах диапазон может быть указан как пара итератор-ограничитель или как один аргумент range
, и поддерживаются проекции и вызываемые объекты указателя на элемент. Кроме того, возвращаемые типы большинства алгоритмов были изменены, чтобы возвращать всю потенциально полезную информацию, вычисленную во время выполнения алгоритма.
[править] Ограниченные алгоритмы
Определены в заголовочном файле
<algorithm> | |
Определены в пространстве имён
std::ranges | |
Немодифицирующие операции с последовательностями | |
(C++20)(C++20)(C++20) |
проверяет, равен ли предикат true для всех, любого или ни одного из элементов в диапазоне (ниблоид) |
(C++20) |
применяет функцию к диапазону элементов (ниблоид) |
(C++20) |
применяет объект функцию к первым n элементам последовательности (ниблоид) |
(C++20)(C++20) |
возвращает количество элементов, соответствующих определённым критериям (ниблоид) |
(C++20) |
находит первую позицию, в которой два диапазона различаются (ниблоид) |
(C++20) |
определяет, одинаковы ли два множества элементов (ниблоид) |
возвращает true, если один диапазон лексикографически меньше другого (ниблоид) | |
(C++20)(C++20)(C++20) |
находит первый элемент, соответствующий определённым критериям (ниблоид) |
(C++23)(C++23)(C++23) |
находит последний элемент, соответствующий определённым критериям (ниблоид) |
(C++20) |
находит последнюю последовательность элементов в определённом диапазоне (ниблоид) |
(C++20) |
ищет любой элемент из набора элементов (ниблоид) |
(C++20) |
находит первые два соседних элемента, которые равны (или соответствуют заданному предикату) (ниблоид) |
(C++20) |
ищет диапазон элементов (ниблоид) |
(C++20) |
ищет несколько последовательных копий элемента в диапазоне (ниблоид) |
(C++23)(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++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) |
выбирает n случайных элементов из последовательности (ниблоид) |
(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) |
возвращает true, если одна последовательность является подпоследовательностью другой (ниблоид) |
(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> | |
Определены в пространстве имён
std::ranges | |
(C++20) |
копирует диапазон объектов в неинициализированную область памяти (ниблоид) |
(C++20) |
копирует ряд объектов в неинициализированную область памяти (ниблоид) |
(C++20) |
копирует объект в неинициализированную область памяти, определяемую диапазоном (ниблоид) |
(C++20) |
копирует объект в неинициализированную область памяти, определяемую началом и количеством (ниблоид) |
(C++20) |
перемещает диапазон объектов в неинициализированную область памяти (ниблоид) |
(C++20) |
перемещает ряд объектов в неинициализированную область памяти (ниблоид) |
создаёт объекты инициализацией по умолчанию в неинициализированной области памяти, определяемой диапазоном (ниблоид) | |
создаёт объекты инициализацией по умолчанию в неинициализированной области памяти, определяемой началом и количеством (ниблоид) | |
создаёт объекты инициализацией значением в неинициализированной области памяти, определяемой диапазоном (ниблоид) | |
создаёт объекты инициализированные значением в неинициализированной области памяти, определяемой началом и количеством (ниблоид) | |
(C++20) |
уничтожает диапазон объектов (ниблоид) |
(C++20) |
уничтожает несколько объектов в диапазоне (ниблоид) |
(C++20) |
уничтожает объект по заданному адресу (ниблоид) |
(C++20) |
создаёт объект по заданному адресу (ниблоид) |
[править] Возвращаемые типы
Определены в заголовочном файле
<algorithm> | |
Определены в пространстве имён
std::ranges | |
(C++20) |
предоставляет способ хранить итератор и объект функции как единое целое (шаблон класса) |
(C++20) |
предоставляет способ хранить два итератора как единое целое (шаблон класса) |
(C++20) |
предоставляет способ хранить два итератора как единое целое (шаблон класса) |
(C++20) |
предоставляет способ хранить три итератора как единое целое (шаблон класса) |
(C++20) |
предоставляет способ хранить три итератора как единое целое (шаблон класса) |
(C++20) |
предоставляет способ хранить два объекта или ссылки одного типа как единое целое (шаблон класса) |
(C++20) |
предоставляет способ хранить итератор и логический флаг как единое целое (шаблон класса) |
(C++23) |
предоставляет способ хранить итератор и значение как единое целое (шаблон класса) |
(C++23) |
предоставляет способ хранить итератор и значение как единое целое (шаблон класса) |
[править] Примечание
Макрос тест функциональности | Значение | Стандарт | Комментарий |
---|---|---|---|
__cpp_lib_ranges |
201911L | (C++20) | Библиотека диапазонов и алгоритмы с ограничениями |
__cpp_lib_ranges_contains |
202207L | (C++23) | std::ranges::contains |
__cpp_lib_find_last |
202207L | (C++23) | std::ranges::find_last |
__cpp_lib_ranges_fold |
202207L | (C++23) | std::ranges fold algorithms
|
__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 |