Ranges library (since C++20)
Библиотека ranges является расширением и обобщением библиотек алгоритмов и итераторов, делая их более мощными за счёт композируемости и снижения вероятности ошибок.
Библиотека создает и манипулирует представлениями диапазонов — легковесными объектами, которые косвенно представляют итерируемые последовательности ( диапазоны ). Диапазоны являются абстракцией поверх
-
[начало,конец)– пары итераторов, например диапазоны, созданные неявным преобразованием из контейнеров. Все алгоритмы, принимающие пары итераторов, теперь имеют перегрузки, принимающие диапазоны (например, ranges::sort ) -
начало
+[ 0 ,размер)– нумерованные последовательности, например диапазон, возвращаемый views::counted -
[начало,предикат)– условно-ограниченные последовательности, например диапазон, возвращаемый views::take_while -
[начало,..)– неограниченные последовательности, например диапазон, возвращаемый views::iota
Библиотека ranges включает range algorithms , которые применяются к диапазонам немедленно, и range adaptors , которые применяются к представлениям лениво. Адаптеры могут комбинироваться в конвейеры, чтобы их действия выполнялись при итерации представления.
|
Определено в заголовочном файле
<ranges>
|
||
|
namespace
std
{
namespace
views
=
ranges
::
views
;
|
(начиная с C++20) | |
Псевдоним пространства имён
std::views
предоставляется как сокращение для
std::ranges::views
.
|
Определено в пространстве имён
std::ranges
|
|
Доступ к диапазонам |
|
|
Определено в заголовке
<ranges>
|
|
|
Определено в заголовке
<iterator>
|
|
|
(C++20)
|
возвращает итератор на начало диапазона
(объект точки кастомизации) |
|
(C++20)
|
возвращает sentinel, указывающий на конец диапазона
(объект точки кастомизации) |
|
(C++20)
|
возвращает итератор на начало диапазона только для чтения
(объект точки кастомизации) |
|
(C++20)
|
возвращает sentinel, указывающий на конец диапазона только для чтения
(объект точки кастомизации) |
|
(C++20)
|
возвращает обратный итератор к диапазону
(объект точки кастомизации) |
|
(C++20)
|
возвращает обратный конечный итератор для диапазона
(объект точки кастомизации) |
|
(C++20)
|
возвращает обратный итератор для диапазона только для чтения
(объект точки кастомизации) |
|
(C++20)
|
возвращает обратный конечный итератор для диапазона только для чтения
(объект точки кастомизации) |
|
(C++26)
|
возвращает целое число, равное подсказке резервирования, предоставленной диапазоном
(объект точки кастомизации) |
|
(C++20)
|
возвращает целое число, равное размеру диапазона
(объект точки настройки) |
|
(C++20)
|
возвращает знаковое целое число, равное размеру диапазона
(объект точки кастомизации) |
|
(C++20)
|
проверяет, является ли диапазон пустым
(объект точки кастомизации) |
|
(C++20)
|
получает указатель на начало непрерывного диапазона
(объект точки кастомизации) |
|
(C++20)
|
получает указатель на начало диапазона только для чтения с непрерывным расположением
(объект точки настройки) |
Примитивы диапазонов |
|
|
Определено в заголовке
<ranges>
|
|
|
(C++20)
(C++23)
(C++20)
(C++23)
|
получает типы итератора и сторожа диапазона
(псевдоним шаблона) |
|
(C++20)
(C++20)
(C++20)
|
получает типы размера, разности и значения диапазона
(псевдоним шаблона) |
|
(C++20)
(C++23)
(C++20)
(C++20)
|
получает ссылочные типы диапазона
(псевдоним шаблона) |
Обработка висячих итераторов |
|
|
Определено в заголовке
<ranges>
|
|
|
(C++20)
|
тип-заполнитель, указывающий, что итератор или
subrange
не должен возвращаться, поскольку он будет висячим
(класс) |
получает тип итератора или
subrange
для
borrowed_range
(псевдоним шаблона) |
|
Другие утилиты |
|
|
Определено в заголовке
<ranges>
|
|
|
(C++23)
|
помечает диапазон для обработки как последовательности, а не одиночного значения
(шаблон класса) |
Концепции диапазонов |
|
|
Определено в заголовке
<ranges>
|
|
|
(C++20)
|
указывает, что тип является диапазоном, то есть предоставляет
begin
итератор и
end
cентинел
(концепт) |
|
(C++20)
|
указывает, что тип является
range
и итераторы, полученные из его выражения, могут быть безопасно возвращены без риска висячих ссылок
(концепт) |
|
определяет, что диапазон может оценить свой размер за постоянное время
(концепт) |
|
|
(C++20)
|
указывает, что диапазон знает свой размер за постоянное время
(концепт) |
|
(C++20)
|
указывает, что диапазон является представлением, то есть имеет константное время копирования/перемещения/присваивания
(концепт) |
|
(C++20)
|
определяет диапазон, тип итератора которого удовлетворяет
input_iterator
(концепт) |
|
(C++20)
|
определяет диапазон, тип итератора которого удовлетворяет
output_iterator
(концепт) |
|
(C++20)
|
задаёт диапазон, тип итератора которого удовлетворяет
forward_iterator
(концепт) |
|
(C++20)
|
задаёт диапазон, тип итератора которого удовлетворяет
bidirectional_iterator
(концепт) |
|
(C++20)
|
задаёт диапазон, тип итератора которого удовлетворяет
random_access_iterator
(концепт) |
|
(C++20)
|
задаёт диапазон, тип итератора которого удовлетворяет
contiguous_iterator
(концепт) |
|
(C++20)
|
определяет, что диапазон имеет идентичные типы итератора и sentinel
(концепт) |
|
(C++20)
|
определяет требования для
range
для безопасного преобразования в
view
(концепт) |
|
(C++23)
|
указывает, что диапазон имеет элементы только для чтения
(концепт) |
Преобразования диапазонов |
|
|
Определено в заголовочном файле
<ranges>
|
|
|
(C++23)
|
создает новый объект, не являющийся представлением, из входного диапазона
(шаблон функции) |
Представления |
|
|
Определено в заголовке
<ranges>
|
|
|
(C++20)
|
вспомогательный шаблон класса для определения
view
, использующий
curiously recurring template pattern
(шаблон класса) |
|
(C++20)
|
объединяет пару итератор-страж в
view
(шаблон класса) |
Фабрики диапазонов
|
Определено в заголовке
<ranges>
|
|
|
Определено в пространстве имен
std::ranges
|
|
|
(C++20)
|
пустое
view
без элементов
(шаблон класса) (шаблон переменной) |
view
содержащий один элемент указанного значения
(шаблон класса) (объект точки настройки) |
|
|
(C++20)
|
view
состоящий из последовательности, сгенерированной повторным инкрементом начального значения
(шаблон класса) (объект точки настройки) |
view
состоящий из сгенерированной последовательности путем повторного создания того же значения
(шаблон класса) (объект точки настройки) |
|
view
состоящий из элементов, полученных последовательным применением
operator>>
к связанному входному потоку
(шаблон класса) (объект точки настройки) |
|
Адаптеры диапазонов
|
Определено в заголовочном файле
<ranges>
|
|
|
Определено в пространстве имён
std::ranges
|
|
|
(C++23)
|
вспомогательный шаблон базового класса для определения объекта замыкания адаптера диапазона
(шаблон класса) |
|
(C++20)
|
представление
view
, которое включает все элементы
range
(псевдоним шаблона) (объект адаптера диапазона) |
|
(C++20)
|
представление
view
элементов некоторого другого
range
(шаблон класса) |
|
(C++20)
|
представление
view
с уникальным владением некоторого
range
(шаблон класса) |
представление
view
последовательности, которое преобразует каждый элемент в rvalue
(шаблон класса) (объект адаптера диапазона) |
|
представление, которое состоит из элементов
range
, удовлетворяющих предикату
(шаблон класса) (объект адаптера диапазона) |
|
представление
view
последовательности, которое применяет функцию преобразования к каждому элементу
(шаблон класса) (объект адаптера диапазона) |
|
|
(C++20)
|
представление,
view
состоящее из первых N элементов другого
view
(шаблон класса) (объект адаптера диапазона) |
представление,
view
состоящее из начальных элементов другого
view
, до первого элемента, для которого предикат возвращает
false
(шаблон класса) (объект адаптера диапазона) |
|
|
(C++20)
|
представление,
view
состоящее из элементов другого
view
, пропускающее первые N элементов
(шаблон класса) (адаптер диапазона) |
представление,
view
состоящее из элементов другого
view
, пропускающее начальную подпоследовательность элементов до первого элемента, где предикат возвращает
false
(шаблон класса) (объект адаптера диапазона) |
|
|
(C++20)
|
представление,
view
состоящее из последовательности, полученной путём выравнивания
view
из
range
s
(шаблон класса) (объект адаптера диапазона) |
представление,
view
состоящее из последовательности, полученной путём выравнивания представления диапазонов, с разделителем между элементами
(шаблон класса) (объект адаптера диапазона) |
|
представление
view
над поддиапазонами, полученными при разделении другого
view
с использованием разделителя
(шаблон класса) (объект адаптера диапазона) |
|
|
(C++20)
|
представление
view
над поддиапазонами, полученными при разделении другого
view
с использованием разделителя
(шаблон класса) (объект адаптера диапазона) |
представление,
view
состоящее из конкатенации адаптированных представлений
(шаблон класса) (объект точки кастомизации) |
|
|
(C++20)
|
создает поддиапазон из итератора и счетчика
(объект точки кастомизации) |
преобразует
view
в
common_range
(шаблон класса) (объект адаптера диапазона) |
|
представление
view
, которое итерирует по элементам другого двунаправленного представления в обратном порядке
(шаблон класса) (объект адаптера диапазона) |
|
преобразует
view
в
constant_range
(шаблон класса) (объект адаптера диапазона) |
|
принимает
view
состоящий из
tuple-like
значений и число N, и создаёт
view
N
-го
элемента каждого кортежа
(шаблон класса) (объект адаптера диапазона) |
|
|
(C++20)
|
принимает
view
состоящий из пароподобных значений и создаёт
view
первых элементов каждой пары
(шаблон класса) (объект адаптера диапазона) |
принимает
view
состоящий из пароподобных значений и создаёт
view
вторых элементов каждой пары
(шаблон класса) (объект адаптера диапазона) |
|
представление
view
, которое отображает каждый элемент адаптированной последовательности в кортеж, содержащий как позицию элемента, так и его значение
(шаблон класса) (объект адаптера диапазона) |
|
|
(C++23)
|
представление,
view
состоящее из кортежей ссылок на соответствующие элементы адаптированных представлений
(шаблон класса) (объект точки настройки) |
представление,
view
состоящее из результатов применения функции преобразования к соответствующим элементам адаптированных представлений
(шаблон класса) (объект точки кастомизации) |
|
представление,
view
состоящее из кортежей ссылок на смежные элементы адаптированного представления
(шаблон класса) (объект адаптера диапазона) |
|
представление,
view
состоящее из результатов применения функции преобразования к смежным элементам адаптированного представления
(шаблон класса) (объект адаптера диапазона) |
|
|
(C++23)
|
диапазон
view
s
, которые представляют собой неперекрывающиеся последовательные чанки размером
N
элементов другого
view
(шаблон класса) (объект адаптера диапазона) |
|
(C++23)
|
представление,
view
чей M
-й
элемент является
view
над M
-м
по (M + N - 1)
-й
элементы другого
view
(шаблон класса) (объект адаптера диапазона) |
разделяет
view
на поддиапазоны между каждой парой смежных элементов, для которых заданный предикат возвращает
false
(шаблон класса) (объект адаптера диапазона) |
|
представление,
view
состоящее из элементов другого
view
, продвигающееся по N элементов за раз
(шаблон класса) (объект адаптера диапазона) |
|
представление,
view
состоящее из кортежей результатов, вычисленных с помощью n-арного декартова произведения адаптированных представлений
(шаблон класса) (объект точки настройки) |
|
представление
view
, которое кэширует последний доступный элемент своей базовой последовательности
(шаблон класса) (объект адаптера диапазона) |
|
преобразует
view
в диапазон, который является исключительно
input_range
и не является
common_range
(шаблон класса) (объект адаптера диапазона) |
|
Генераторы диапазонов (начиная с C++23)
|
Определено в заголовке
<generator>
|
|
|
Определено в пространстве имен
std
|
|
|
(C++23)
|
view
представляющий синхронный
корутинный
генератор
(шаблон класса) |
Вспомогательные элементы
Объекты адаптеров диапазонов
См. RangeAdaptorObject (RAO).
Объекты замыкания адаптеров диапазонов
См. RangeAdaptorClosureObject (RACO).
Объекты точек кастомизации
См. Объект точки кастомизации (CPO).
Обёртка с возможностью присваивания
Некоторые адаптеры диапазонов оборачивают свои элементы или функциональные объекты в
copyable-box
(until C++23)
movable-box
(since C++23)
. Обертка добавляет обернутому объекту возможность присваивания, когда это необходимо.
Не распространяющийся кэш
Некоторые адаптеры диапазонов определяются с использованием только демонстрационного шаблона класса
non-propagating-cache
, который ведет себя почти как
std::
optional
<
T
>
(см. описание для различий).
Условно-
const
тип
|
template
<
bool
Const,
class
T
>
using /*maybe-const*/ = std:: conditional_t < Const, const T, T > ; |
( только для демонстрации* ) | |
Псевдоним-шаблон
/*maybe-const*/
является сокращённой записью, используемой для условного применения квалификатора
const
к типу
T
.
Вспомогательные шаблоны для целочисленных типов
|
template
<
/*is-integer-like*/
T
>
using /*make-signed-like-t*/ < T > = /* см. описание */ ; |
(1) | ( только для демонстрации* ) |
|
template
<
/*is-integer-like*/
T
>
using /*make-unsigned-like-t*/ < T > = /* см. описание */ ; |
(2) | ( только для демонстрации* ) |
|
template
<
/*is-integer-like*/
T
>
/*make-unsigned-like-t*/
<
T
>
/*to-unsigned-like*/
(
T t
)
|
(3) | ( только для демонстрации* ) |
T
:
-
Если
Tявляется целочисленным типом, /*make-signed-like-t*/ < T > является std:: make_signed_t < T > . -
В противном случае,
/*make-signed-like-t*/
<
T
>
является соответствующим неуказанным знаковым целочисленным типом той же ширины, что и
T.
T
:
-
Если
Tявляется целочисленным типом, /*make-unsigned-like-t*/ < T > является std:: make_unsigned_t < T > . -
В противном случае,
/*make-signed-like-t*/
<
T
>
является соответствующим неуказанным беззнаковым целочисленным типом той же ширины, что и
T.
Вспомогательные объекты точек кастомизации
|
template
<
ranges::
input_range
R
>
constexpr
auto
&
/*возможно-константный-диапазон*/
(
R
&
r
)
noexcept
|
(1) | ( только для демонстрации* ) |
|
template
<
class
T
>
constexpr
auto
/*как-константный-указатель*/
(
const
T
*
p
)
noexcept
|
(2) | ( только для демонстрации* ) |
Некоторые объекты точек настройки доступа к диапазонам определяются с помощью этих демонстрационных шаблонов функций.
input_range
; в противном случае возвращает
r
без какого-либо приведения.
Вспомогательные средства адаптеров диапазонов
|
template
<
class
F,
class
Tuple
>
constexpr
auto
/*tuple-transform*/
(
F
&&
f, Tuple
&&
tuple
)
|
(1) | ( только для демонстрации* ) |
|
template
<
class
F,
class
Tuple
>
constexpr
void
/*tuple-for-each*/
(
F
&&
f, Tuple
&&
tuple
)
|
(2) | ( только для демонстрации* ) |
|
template
<
class
T
>
constexpr
T
&
/*as-lvalue*/
(
T
&&
t
)
|
(3) | ( только для демонстрации* ) |
Некоторые адаптеры диапазонов определяются с помощью этих демонстрационных шаблонов функций.
Вспомогательные концепции
Следующие концепции, предназначенные только для экспозиции, используются для нескольких типов, но они не являются частью интерфейса стандартной библиотеки.
|
template
<
class
R
>
concept
/*простое представление*/
=
|
(1) | ( только для демонстрации* ) |
|
template
<
class
I
>
concept
/*has-arrow*/
=
|
(2) | ( только для демонстрации* ) |
|
template
<
class
T,
class
U
>
concept
/*отличается-от*/
=
|
(3) | ( только для демонстрации* ) |
|
template
<
class
R
>
concept
/*диапазон-с-перемещаемыми-ссылками*/
=
|
(4) | ( только для демонстрации* ) |
|
template
<
bool
C,
class
...
Views
>
концепт
/*all-random-access*/
=
|
(5) | ( только для демонстрации* ) |
|
template
<
bool
C,
class
...
Views
>
концепт
/*all-bidirectional*/
=
|
(6) | ( только для демонстрации* ) |
|
template
<
bool
C,
class
...
Views
>
концепт
/*all-forward*/
=
|
(7) | ( только для демонстрации* ) |
Примечания
| Макрос проверки возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_generator
|
202207L
|
(C++23) | std:: generator – синхронный генератор корутин для диапазонов |
__cpp_lib_ranges
|
201911L
|
(C++20) | Библиотека диапазонов и ограниченные алгоритмы |
202106L
|
(C++23)
(DR20) |
Нетипизированные default-initializable views | |
202110L
|
(C++23)
(DR20) |
Views с владением | |
202202L
|
(C++23) | ranges:: range_adaptor_closure | |
202207L
|
(C++23) | Ослабление требований к range adaptors для поддержки типов только с перемещением | |
202211L
|
(C++23) | Удаление "ядовитых таблеток" (P2602) перегрузок в ranges:: begin и других | |
202302L
|
(C++23) | Ослабление требований к диапазонам для разрешения определённых проекций | |
202406L
|
(C++26)
(DR20) |
Удаление требования общего ссылочного типа из концепций косвенного вызова | |
__cpp_lib_ranges_as_const
|
202207L
|
(C++23) | std:: const_iterator , ranges:: as_const_view |
__cpp_lib_ranges_as_rvalue
|
202207L
|
(C++23) | ranges:: as_rvalue_view |
__cpp_lib_ranges_cache_latest
|
202411L
|
(C++26) | ranges :: cache_latest_view |
__cpp_lib_ranges_cartesian_product
|
202207L
|
(C++23) | ranges:: cartesian_product_view |
__cpp_lib_ranges_chunk
|
202202L
|
(C++23) | ranges:: chunk_view |
__cpp_lib_ranges_chunk_by
|
202202L
|
(C++23) | ranges:: chunk_by_view |
__cpp_lib_ranges_concat
|
202403L
|
(C++26) | ranges:: concat_view |
__cpp_lib_ranges_enumerate
|
202302L
|
(C++23) | ranges :: enumerate_view |
__cpp_lib_ranges_join_with
|
202202L
|
(C++23) | ranges:: join_with_view |
__cpp_lib_ranges_repeat
|
202207L
|
(C++23) | ranges:: repeat_view |
__cpp_lib_ranges_reserve_hint
|
202502L
|
(C++26) | ranges :: reserve_hint и ranges :: approximately_sized_range |
__cpp_lib_ranges_slide
|
202202L
|
(C++23) | ranges:: slide_view |
__cpp_lib_ranges_stride
|
202207L
|
(C++23) | ranges:: stride_view |
__cpp_lib_ranges_to_container
|
202202L
|
(C++23) | ranges:: to |
__cpp_lib_ranges_to_input
|
202502L
|
(C++26) | ranges :: to_input_view |
__cpp_lib_ranges_zip
|
202110L
|
(C++23) |
ranges::
zip_view
,
ranges:: zip_transform_view , ranges:: adjacent_view , ranges:: adjacent_transform_view |
Пример
#include <iostream> #include <ranges> int main() { auto const ints = {0, 1, 2, 3, 4, 5}; auto even = [](int i) { return 0 == i % 2; }; auto square = [](int i) { return i * i; }; // синтаксис "конвейера" для композиции представлений: for (int i : ints | std::views::filter(even) | std::views::transform(square)) std::cout << i << ' '; std::cout << '\n'; // традиционный "функциональный" синтаксис композиции: for (int i : std::views::transform(std::views::filter(ints, even), square)) std::cout << i << ' '; }
Вывод:
0 4 16 0 4 16
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
|
LWG 3509
( P2281R1 ) |
C++20 | было неясно, как объекты адаптеров диапазонов связывают завершающие аргументы |
они связываются
по значению |
| LWG 3948 | C++23 |
possibly-const-range
и
as-const-pointer
не были объявлены noexcept |
объявлены noexcept |
| LWG 4027 | C++23 |
possibly-const-range
не добавлял квалификатор const
для диапазонов, которые уже моделировали
constant_range
|
добавляет квалификатор const
для таких диапазонов |
| LWG 4112 | C++20 |
has-arrow
не требовал, чтобы
i
был const-квалифицирован
|
требует |