Spec-Zone.ru › C++

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

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

Объекты-функции алгоритмов

Объект-функция алгоритма (AFO), неофициально известный как niebloid , — это объект точки настройки (CPO), заданный одним или несколькими перегруженными шаблонами функций. Имя этих шаблонов функций обозначает соответствующий объект-функцию алгоритма.

Для объекта-функции алгоритма o пусть S — соответствующее множество шаблонов функций. Тогда для любой последовательности аргументов args... выражение o(args...) эквивалентно выражению s(args...), где результат поиска имени для s — множество перегрузок S.

Алгоритмы с ограничениями в пространстве имён std::ranges определены как объекты-функции алгоритмов. В результате:

  • При вызове любого из них нельзя указывать явные списки аргументов шаблона.
  • Ни один из них не виден при поиске с учётом аргументов.
  • Если любой из них найден при обычном неквалифицированном поиске как имя слева от оператора вызова функции, поиск с учётом аргументов подавляется.

Параметры-диапазоны

Некоторые перегрузки принимают аргументы типа range. Они ведут себя так, как если бы реализовывались путём вызова соответствующей перегрузки в пространстве имён ranges, принимающей отдельные аргументы-итератор и сентинел, где для каждого аргумента-диапазона r:

  • Соответствующий аргумент-итератор инициализируется значением ranges::begin(r).
  • Соответствующий аргумент-сентинел инициализируется значением ranges::end(r).
(до C++26)
  • Соответствующий аргумент-сентинел инициализируется следующим образом:
    • значением ranges::next(ranges::begin(r), ranges::end(r)), если тип r удовлетворяет концепту forward_range, а вычисление ranges::next соответствует заданным требованиям к сложности.
    • значением ranges::end(r) в противном случае.
(начиная с C++26)

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

Определено в заголовке <algorithm>
Определено в пространстве имён std::ranges
Пакетные операции
ranges::for_each
(C++20)
применяет унарный объект-функцию к элементам диапазона
(объект-функция алгоритма)
ranges::for_each_n
(C++20)
применяет объект-функцию к первым N элементам последовательности
(объект-функция алгоритма)
Операции поиска
ranges::all_ofranges::any_ofranges::none_of
(C++20)(C++20)(C++20)
проверяет, является ли предикат true для всех, некоторых или ни для одного из элементов диапазона
(объект-функция алгоритма)
ranges::containsranges::contains_subrange
(C++23)(C++23)
проверяет, содержит ли диапазон заданный элемент или поддиапазон
(объект-функция алгоритма)
ranges::findranges::find_ifranges::find_if_not
(C++20)(C++20)(C++20)
находит первый элемент, удовлетворяющий заданным критериям
(объект-функция алгоритма)
ranges::find_lastranges::find_last_ifranges::find_last_if_not
(C++23)(C++23)(C++23)
находит последний элемент, удовлетворяющий заданным критериям
(объект-функция алгоритма)
ranges::find_end
(C++20)
находит последнюю последовательность элементов в заданном диапазоне
(объект-функция алгоритма)
ranges::find_first_of
(C++20)
ищет любой из заданного набора элементов
(объект-функция алгоритма)
ranges::adjacent_find
(C++20)
находит первые два соседних элемента, которые равны (или удовлетворяют заданному предикату)
(объект-функция алгоритма)
ranges::countranges::count_if
(C++20)(C++20)
возвращает количество элементов, удовлетворяющих заданным критериям
(объект-функция алгоритма)
ranges::mismatch
(C++20)
находит первую позицию, в которой два диапазона различаются
(объект-функция алгоритма)
ranges::equal
(C++20)
определяет, совпадают ли два набора элементов
(объект-функция алгоритма)
ranges::search
(C++20)
ищет первое вхождение диапазона элементов
(объект-функция алгоритма)
ranges::search_n
(C++20)
ищет первое вхождение в диапазоне заданного количества подряд идущих копий элемента
(объект-функция алгоритма)
ranges::starts_with
(C++23)
проверяет, начинается ли диапазон с другого диапазона
(объект-функция алгоритма)
ranges::ends_with
(C++23)
проверяет, заканчивается ли диапазон другим диапазоном
(объект-функция алгоритма)
Операции свёртки
indirectly-binary-left-foldableindirectly-binary-right-foldable
(C++23)(C++23)
задаёт требование, согласно которому вызываемый тип можно использовать в алгоритмах свёртки
(концепт только для описания*)
ranges::fold_left
(C++23)
выполняет свёртку диапазона элементов слева направо
(объект-функция алгоритма)
ranges::fold_left_first
(C++23)
выполняет свёртку диапазона элементов слева направо, используя первый элемент в качестве начального значения
(объект-функция алгоритма)
ranges::fold_right
(C++23)
выполняет свёртку диапазона элементов справа налево
(объект-функция алгоритма)
ranges::fold_right_last
(C++23)
выполняет свёртку диапазона элементов справа налево, используя последний элемент в качестве начального значения
(объект-функция алгоритма)
ranges::fold_left_with_iter
(C++23)
выполняет свёртку диапазона элементов слева направо и возвращает пару (итератор, значение)
(объект-функция алгоритма)
ranges::fold_left_first_with_iter
(C++23)
выполняет свёртку диапазона элементов слева направо, используя первый элемент в качестве начального значения, и возвращает пару (итератор, optional)
(объект-функция алгоритма)

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

Определено в заголовке <algorithm>
Определено в пространстве имён std::ranges
Операции копирования
ranges::copyranges::copy_if
(C++20)(C++20)
копирует диапазон элементов в новое место
(объект-функция алгоритма)
ranges::copy_n
(C++20)
копирует заданное количество элементов в новое место
(объект-функция алгоритма)
ranges::copy_backward
(C++20)
копирует диапазон элементов в обратном порядке
(объект-функция алгоритма)
ranges::move
(C++20)
перемещает диапазон элементов в новое место
(объект-функция алгоритма)
ranges::move_backward
(C++20)
перемещает диапазон элементов в новое место в обратном порядке
(объект-функция алгоритма)
Операции обмена
ranges::swap_ranges
(C++20)
обменивает местами два диапазона элементов
(объект-функция алгоритма)
Операции преобразования
ranges::transform
(C++20)
применяет функцию к диапазону элементов
(объект-функция алгоритма)
ranges::replaceranges::replace_if
(C++20)(C++20)
заменяет все значения, удовлетворяющие заданным критериям, другим значением
(объект-функция алгоритма)
ranges::replace_copyranges::replace_copy_if
(C++20)(C++20)
копирует диапазон, заменяя элементы, удовлетворяющие заданным критериям, другим значением
(объект-функция алгоритма)
Операции генерации
ranges::fill
(C++20)
присваивает элементам диапазона заданное значение
(объект-функция алгоритма)
ranges::fill_n
(C++20)
присваивает значение заданному количеству элементов
(объект-функция алгоритма)
ranges::generate
(C++20)
сохраняет результат функции в диапазоне
(объект-функция алгоритма)
ranges::generate_n
(C++20)
сохраняет результат N вызовов функции
(объект-функция алгоритма)
Операции удаления
ranges::removeranges::remove_if
(C++20)(C++20)
удаляет элементы, удовлетворяющие заданным критериям
(объект-функция алгоритма)
ranges::remove_copyranges::remove_copy_if
(C++20)(C++20)
копирует диапазон элементов, исключая те, которые удовлетворяют заданным критериям
(объект-функция алгоритма)
ranges::unique
(C++20)
удаляет повторяющиеся подряд элементы диапазона
(объект-функция алгоритма)
ranges::unique_copy
(C++20)
создаёт копию части диапазона элементов без повторяющихся подряд элементов
(объект-функция алгоритма)
Операции изменения порядка
ranges::reverse
(C++20)
изменяет порядок элементов диапазона на обратный
(объект-функция алгоритма)
ranges::reverse_copy
(C++20)
создаёт копию диапазона с обратным порядком элементов
(объект-функция алгоритма)
ranges::rotate
(C++20)
циклически сдвигает элементы диапазона
(объект-функция алгоритма)
ranges::rotate_copy
(C++20)
копирует диапазон элементов с циклическим сдвигом
(объект-функция алгоритма)
ranges::shift_leftranges::shift_right
(C++23)(C++23)
сдвигает элементы диапазона
(объект-функция алгоритма)
ranges::shuffle
(C++20)
случайным образом переставляет элементы диапазона
(объект-функция алгоритма)
Операции выборки
ranges::sample
(C++20)
выбирает N случайных элементов из последовательности
(объект-функция алгоритма)

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

Определено в заголовочном файле <algorithm>
Определено в пространстве имён std::ranges
Операции разбиения
ranges::is_partitioned
(C++20)
определяет, разбит ли диапазон согласно заданному предикату
(функциональный объект алгоритма)
ranges::partition
(C++20)
разделяет диапазон элементов на две группы
(функциональный объект алгоритма)
ranges::partition_copy
(C++20)
копирует диапазон, разделяя элементы на две группы
(функциональный объект алгоритма)
ranges::stable_partition
(C++20)
разделяет элементы на две группы, сохраняя их относительный порядок внутри каждой группы
(функциональный объект алгоритма)
ranges::partition_point
(C++20)
находит точку разбиения в разбитом диапазоне
(функциональный объект алгоритма)
Операции сортировки
ranges::is_sorted
(C++20)
проверяет, отсортирован ли диапазон
(функциональный объект алгоритма)
ranges::is_sorted_until
(C++20)
находит наибольший отсортированный поддиапазон
(функциональный объект алгоритма)
ranges::sort
(C++20)
сортирует диапазон элементов
(функциональный объект алгоритма)
ranges::partial_sort
(C++20)
сортирует первые N элементов диапазона
(функциональный объект алгоритма)
ranges::partial_sort_copy
(C++20)
копирует и частично сортирует диапазон элементов
(функциональный объект алгоритма)
ranges::stable_sort
(C++20)
сортирует диапазон элементов, сохраняя относительный порядок эквивалентных элементов
(функциональный объект алгоритма)
ranges::nth_element
(C++20)
находит N-й элемент в том порядке, в котором он находился бы в отсортированном диапазоне
(функциональный объект алгоритма)
Операции двоичного поиска (в отсортированных диапазонах)
ranges::lower_bound
(C++20)
находит с помощью двоичного поиска первый элемент, не меньший заданного значения
(функциональный объект алгоритма)
ranges::upper_bound
(C++20)
находит с помощью двоичного поиска первый элемент, больший заданного значения
(функциональный объект алгоритма)
ranges::binary_search
(C++20)
определяет с помощью двоичного поиска, существует ли элемент в диапазоне
(функциональный объект алгоритма)
ranges::equal_range
(C++20)
находит с помощью двоичного поиска диапазон элементов, соответствующих заданному значению
(функциональный объект алгоритма)
Операции над множествами (в отсортированных диапазонах)
ranges::includes
(C++20)
определяет, является ли одна последовательность подпоследовательностью другой
(функциональный объект алгоритма)
ranges::set_difference
(C++20)
вычисляет разность двух множеств
(функциональный объект алгоритма)
ranges::set_intersection
(C++20)
вычисляет пересечение двух множеств
(функциональный объект алгоритма)
ranges::set_symmetric_difference
(C++20)
вычисляет симметрическую разность двух множеств
(функциональный объект алгоритма)
ranges::set_union
(C++20)
вычисляет объединение двух множеств
(функциональный объект алгоритма)
Операции слияния (в отсортированных диапазонах)
ranges::merge
(C++20)
сливает два отсортированных диапазона
(функциональный объект алгоритма)
ranges::inplace_merge
(C++20)
сливает два упорядоченных диапазона на месте
(функциональный объект алгоритма)
Операции с кучей
ranges::is_heap
(C++20)
проверяет, является ли заданный диапазон max-кучей
(функциональный объект алгоритма)
ranges::is_heap_until
(C++20)
находит наибольший поддиапазон, являющийся max-кучей
(функциональный объект алгоритма)
ranges::make_heap
(C++20)
создаёт max-кучу из диапазона элементов
(функциональный объект алгоритма)
ranges::push_heap
(C++20)
добавляет элемент в max-кучу
(функциональный объект алгоритма)
ranges::pop_heap
(C++20)
удаляет наибольший элемент из max-кучи
(функциональный объект алгоритма)
ranges::sort_heap
(C++20)
преобразует max-кучу в отсортированный диапазон элементов
(функциональный объект алгоритма)
Операции поиска минимума и максимума
ranges::max
(C++20)
возвращает большее из заданных значений
(функциональный объект алгоритма)
ranges::max_element
(C++20)
возвращает наибольший элемент диапазона
(функциональный объект алгоритма)
ranges::min
(C++20)
возвращает меньшее из заданных значений
(функциональный объект алгоритма)
ranges::min_element
(C++20)
возвращает наименьший элемент диапазона
(функциональный объект алгоритма)
ranges::minmax
(C++20)
возвращает меньшее и большее из двух элементов
(функциональный объект алгоритма)
ranges::minmax_element
(C++20)
возвращает наименьший и наибольший элементы диапазона
(функциональный объект алгоритма)
ranges::clamp
(C++20)
ограничивает значение заданными нижней и верхней границами
(функциональный объект алгоритма)
Операции лексикографического сравнения
ranges::lexicographical_compare
(C++20)
лексикографически сравнивает два диапазона
(функциональный объект алгоритма)
Операции перестановок
ranges::is_permutation
(C++20)
определяет, является ли одна последовательность перестановкой другой
(функциональный объект алгоритма)
ranges::next_permutation
(C++20)
генерирует следующую лексикографически большую перестановку элементов диапазона
(функциональный объект алгоритма)
ranges::prev_permutation
(C++20)
генерирует следующую лексикографически меньшую перестановку элементов диапазона
(функциональный объект алгоритма)

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

Определено в заголовочном файле <numeric>
Определено в пространстве имён std::ranges
ranges::iota
(C++23)
заполняет диапазон последовательными приращениями начального значения
(функциональный объект алгоритма)

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

Определено в заголовочном файле <memory>
Определено в пространстве имён std::ranges
Создание объектов (пакетное)
ranges::construct_at
(C++20)
создаёт объект по заданному адресу
(функциональный объект алгоритма)
ranges::uninitialized_copy
(C++20)
копирует диапазон объектов в неинициализированную область памяти
(функциональный объект алгоритма)
ranges::uninitialized_copy_n
(C++20)
копирует заданное количество объектов в неинициализированную область памяти
(функциональный объект алгоритма)
ranges::uninitialized_fill
(C++20)
копирует объект в неинициализированную область памяти, заданную диапазоном
(функциональный объект алгоритма)
ranges::uninitialized_fill_n
(C++20)
копирует объект в неинициализированную область памяти, заданную начальной позицией и количеством элементов
(функциональный объект алгоритма)
ranges::uninitialized_move
(C++20)
перемещает диапазон объектов в неинициализированную область памяти
(функциональный объект алгоритма)
ranges::uninitialized_move_n
(C++20)
перемещает заданное количество объектов в неинициализированную область памяти
(функциональный объект алгоритма)
ranges::uninitialized_default_construct
(C++20)
создаёт объекты посредством инициализации по умолчанию в неинициализированной области памяти, заданной диапазоном
(функциональный объект алгоритма)
ranges::uninitialized_default_construct_n
(C++20)
создаёт объекты посредством инициализации по умолчанию в неинициализированной области памяти, заданной начальной позицией и количеством элементов
(функциональный объект алгоритма)
ranges::uninitialized_value_construct
(C++20)
создаёт объекты посредством инициализации значением в неинициализированной области памяти, заданной диапазоном
(функциональный объект алгоритма)
ranges::uninitialized_value_construct_n
(C++20)
создаёт объекты посредством инициализации значением в неинициализированной области памяти, заданной начальной позицией и количеством элементов
(функциональный объект алгоритма)
Уничтожение объектов (пакетное)
ranges::destroy
(C++20)
уничтожает диапазон объектов
(функциональный объект алгоритма)
ranges::destroy_n
(C++20)
уничтожает заданное количество объектов в диапазоне
(функциональный объект алгоритма)
ranges::destroy_at
(C++20)
уничтожает объект по заданному адресу
(функциональный объект алгоритма)

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

Определено в заголовочном файле <random>
Определено в пространстве имён std::ranges
ranges::generate_random
(C++26)
заполняет диапазон случайными числами, полученными от равномерного генератора случайных битов
(функциональный объект алгоритма)

Типы возвращаемых значений

Определено в заголовочном файле <algorithm>
Определено в пространстве имён std::ranges
ranges::in_fun_result
(C++20)
предоставляет способ хранить итератор и функциональный объект как единое целое
(шаблон класса)
ranges::in_in_result
(C++20)
предоставляет способ хранить два итератора как единое целое
(шаблон класса)
ranges::in_out_result
(C++20)
предоставляет способ хранить два итератора как единое целое
(шаблон класса)
ranges::in_in_out_result
(C++20)
предоставляет способ хранить три итератора как единое целое
(шаблон класса)
ranges::in_out_out_result
(C++20)
предоставляет способ хранить три итератора как единое целое
(шаблон класса)
ranges::min_max_result
(C++20)
предоставляет способ хранить два объекта или ссылки одного типа как единое целое
(шаблон класса)
ranges::in_found_result
(C++20)
предоставляет способ хранить итератор и логический флаг как единое целое
(шаблон класса)
ranges::in_value_result
(C++23)
предоставляет способ хранить итератор и значение как единое целое
(шаблон класса)
ranges::out_value_result
(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 ниблоиды могли быть специфицированы как
специальные сущности, отличные от функциональных объектов
должны быть специфицированы
как функциональные объекты

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/ranges

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API