Namespaces
Variants

Ranges library (since C++20)

From cppreference.net
Ranges library
Range adaptors

Библиотека 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>
возвращает итератор на начало диапазона
(объект точки кастомизации)
возвращает sentinel, указывающий на конец диапазона
(объект точки кастомизации)
возвращает итератор на начало диапазона только для чтения
(объект точки кастомизации)
возвращает sentinel, указывающий на конец диапазона только для чтения
(объект точки кастомизации)
возвращает обратный итератор к диапазону
(объект точки кастомизации)
возвращает обратный конечный итератор для диапазона
(объект точки кастомизации)
возвращает обратный итератор для диапазона только для чтения
(объект точки кастомизации)
возвращает обратный конечный итератор для диапазона только для чтения
(объект точки кастомизации)
возвращает целое число, равное подсказке резервирования, предоставленной диапазоном
(объект точки кастомизации)
возвращает целое число, равное размеру диапазона
(объект точки настройки)
возвращает знаковое целое число, равное размеру диапазона
(объект точки кастомизации)
проверяет, является ли диапазон пустым
(объект точки кастомизации)
получает указатель на начало непрерывного диапазона
(объект точки кастомизации)
получает указатель на начало диапазона только для чтения с непрерывным расположением
(объект точки настройки)
Примитивы диапазонов
Определено в заголовке <ranges>
получает типы итератора и сторожа диапазона
(псевдоним шаблона)
получает типы размера, разности и значения диапазона
(псевдоним шаблона)
получает ссылочные типы диапазона
(псевдоним шаблона)
Обработка висячих итераторов
Определено в заголовке <ranges>
тип-заполнитель, указывающий, что итератор или subrange не должен возвращаться, поскольку он будет висячим
(класс)
получает тип итератора или subrange для borrowed_range
(псевдоним шаблона)
Другие утилиты
Определено в заголовке <ranges>
помечает диапазон для обработки как последовательности, а не одиночного значения
(шаблон класса)
Концепции диапазонов
Определено в заголовке <ranges>
указывает, что тип является диапазоном, то есть предоставляет begin итератор и end cентинел
(концепт)
указывает, что тип является range и итераторы, полученные из его выражения, могут быть безопасно возвращены без риска висячих ссылок
(концепт)
определяет, что диапазон может оценить свой размер за постоянное время
(концепт)
указывает, что диапазон знает свой размер за постоянное время
(концепт)
указывает, что диапазон является представлением, то есть имеет константное время копирования/перемещения/присваивания
(концепт)
определяет диапазон, тип итератора которого удовлетворяет input_iterator
(концепт)
определяет диапазон, тип итератора которого удовлетворяет output_iterator
(концепт)
задаёт диапазон, тип итератора которого удовлетворяет forward_iterator
(концепт)
задаёт диапазон, тип итератора которого удовлетворяет bidirectional_iterator
(концепт)
задаёт диапазон, тип итератора которого удовлетворяет random_access_iterator
(концепт)
задаёт диапазон, тип итератора которого удовлетворяет contiguous_iterator
(концепт)
определяет, что диапазон имеет идентичные типы итератора и sentinel
(концепт)
определяет требования для range для безопасного преобразования в view
(концепт)
указывает, что диапазон имеет элементы только для чтения
(концепт)
Преобразования диапазонов
Определено в заголовочном файле <ranges>
(C++23)
создает новый объект, не являющийся представлением, из входного диапазона
(шаблон функции)
Представления
Определено в заголовке <ranges>
вспомогательный шаблон класса для определения view , использующий curiously recurring template pattern
(шаблон класса)
объединяет пару итератор-страж в view
(шаблон класса)

Фабрики диапазонов

Определено в заголовке <ranges>
Определено в пространстве имен std::ranges
пустое view без элементов
(шаблон класса) (шаблон переменной)
view содержащий один элемент указанного значения
(шаблон класса) (объект точки настройки)
view состоящий из последовательности, сгенерированной повторным инкрементом начального значения
(шаблон класса) (объект точки настройки)
view состоящий из сгенерированной последовательности путем повторного создания того же значения
(шаблон класса) (объект точки настройки)
view состоящий из элементов, полученных последовательным применением operator>> к связанному входному потоку
(шаблон класса) (объект точки настройки)

Адаптеры диапазонов

Определено в заголовочном файле <ranges>
Определено в пространстве имён std::ranges
вспомогательный шаблон базового класса для определения объекта замыкания адаптера диапазона
(шаблон класса)
представление view , которое включает все элементы range
(псевдоним шаблона) (объект адаптера диапазона)
представление view элементов некоторого другого range
(шаблон класса)
представление view с уникальным владением некоторого range
(шаблон класса)
представление view последовательности, которое преобразует каждый элемент в rvalue
(шаблон класса) (объект адаптера диапазона)
представление, которое состоит из элементов range , удовлетворяющих предикату
(шаблон класса) (объект адаптера диапазона)
представление view последовательности, которое применяет функцию преобразования к каждому элементу
(шаблон класса) (объект адаптера диапазона)
представление, view состоящее из первых N элементов другого view
(шаблон класса) (объект адаптера диапазона)
представление, view состоящее из начальных элементов другого view , до первого элемента, для которого предикат возвращает false
(шаблон класса) (объект адаптера диапазона)
представление, view состоящее из элементов другого view , пропускающее первые N элементов
(шаблон класса) (адаптер диапазона)
представление, view состоящее из элементов другого view , пропускающее начальную подпоследовательность элементов до первого элемента, где предикат возвращает false
(шаблон класса) (объект адаптера диапазона)
представление, view состоящее из последовательности, полученной путём выравнивания view из range s
(шаблон класса) (объект адаптера диапазона)
представление, view состоящее из последовательности, полученной путём выравнивания представления диапазонов, с разделителем между элементами
(шаблон класса) (объект адаптера диапазона)
представление view над поддиапазонами, полученными при разделении другого view с использованием разделителя
(шаблон класса) (объект адаптера диапазона)
представление view над поддиапазонами, полученными при разделении другого view с использованием разделителя
(шаблон класса) (объект адаптера диапазона)
представление, view состоящее из конкатенации адаптированных представлений
(шаблон класса) (объект точки кастомизации)
создает поддиапазон из итератора и счетчика
(объект точки кастомизации)
преобразует view в common_range
(шаблон класса) (объект адаптера диапазона)
представление view , которое итерирует по элементам другого двунаправленного представления в обратном порядке
(шаблон класса) (объект адаптера диапазона)
преобразует view в constant_range
(шаблон класса) (объект адаптера диапазона)
принимает view состоящий из tuple-like значений и число N, и создаёт view N -го элемента каждого кортежа
(шаблон класса) (объект адаптера диапазона)
принимает view состоящий из пароподобных значений и создаёт view первых элементов каждой пары
(шаблон класса) (объект адаптера диапазона)
принимает view состоящий из пароподобных значений и создаёт view вторых элементов каждой пары
(шаблон класса) (объект адаптера диапазона)
представление view , которое отображает каждый элемент адаптированной последовательности в кортеж, содержащий как позицию элемента, так и его значение
(шаблон класса) (объект адаптера диапазона)
представление, view состоящее из кортежей ссылок на соответствующие элементы адаптированных представлений
(шаблон класса) (объект точки настройки)
представление, view состоящее из результатов применения функции преобразования к соответствующим элементам адаптированных представлений
(шаблон класса) (объект точки кастомизации)
представление, view состоящее из кортежей ссылок на смежные элементы адаптированного представления
(шаблон класса) (объект адаптера диапазона)
представление, view состоящее из результатов применения функции преобразования к смежным элементам адаптированного представления
(шаблон класса) (объект адаптера диапазона)
диапазон view s , которые представляют собой неперекрывающиеся последовательные чанки размером N элементов другого view
(шаблон класса) (объект адаптера диапазона)
представление, 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 )
{
return static_cast < /*make-unsigned-like-t*/ < T >> ( t ) ;

}
(3) ( только для демонстрации* )
1) Для целочисленного типа T :
  • Если T является целочисленным типом, /*make-signed-like-t*/ < T > является std:: make_signed_t < T > .
  • В противном случае, /*make-signed-like-t*/ < T > является соответствующим неуказанным знаковым целочисленным типом той же ширины, что и T .
2) Для целочисленного типа T :
  • Если T является целочисленным типом, /*make-unsigned-like-t*/ < T > является std:: make_unsigned_t < T > .
  • В противном случае, /*make-signed-like-t*/ < T > является соответствующим неуказанным беззнаковым целочисленным типом той же ширины, что и T .
3) Явно преобразует t в /*make-unsigned-like-t*/ < T > .

Вспомогательные объекты точек кастомизации

template < ranges:: input_range R >

constexpr auto & /*возможно-константный-диапазон*/ ( R & r ) noexcept
{
if constexpr ( ranges:: input_range < const R > )
return const_cast < const R & > ( r ) ;
else
return r ;

}
(1) ( только для демонстрации* )
template < class T >

constexpr auto /*как-константный-указатель*/ ( const T * p ) noexcept
{
return p ;

}
(2) ( только для демонстрации* )

Некоторые объекты точек настройки доступа к диапазонам определяются с помощью этих демонстрационных шаблонов функций.

1) /*possibly-const-range*/ возвращает константную версию r если const R удовлетворяет концепции input_range ; в противном случае возвращает r без какого-либо приведения.
2) /*as-const-pointer*/ возвращает указатель на объект константного типа.

Вспомогательные средства адаптеров диапазонов

template < class F, class Tuple >

constexpr auto /*tuple-transform*/ ( F && f, Tuple && tuple )
{
return std:: apply ( [ & ] < class ... Ts > ( Ts && ... args )
{
return std:: tuple < std:: invoke_result_t < F & , Ts > ... >
( std:: invoke ( f, std:: forward < Ts > ( args ) ) ... ) ;
} , std:: forward < Tuple > ( tuple ) ) ;

}
(1) ( только для демонстрации* )
template < class F, class Tuple >

constexpr void /*tuple-for-each*/ ( F && f, Tuple && tuple )
{
std:: apply ( [ & ] < class ... Ts > ( Ts && ... args )
{
( static_cast < void > ( std:: invoke ( f, std:: forward < Ts > ( args ) ) ) , ... ) ;
} , std:: forward < Tuple > ( tuple ) ) ;

}
(2) ( только для демонстрации* )
template < class T >

constexpr T & /*as-lvalue*/ ( T && t )
{
return static_cast < T & > ( t ) ;

}
(3) ( только для демонстрации* )

Некоторые адаптеры диапазонов определяются с помощью этих демонстрационных шаблонов функций.

1) /*tuple-transform*/ возвращает новый кортеж, созданный путём применения f к каждому элементу tuple .
2) /*tuple-for-each*/ применяет f к каждому элементу tuple и не возвращает значения.
3) /*as-lvalue*/ передает rvalue t как lvalue.

Вспомогательные концепции

Следующие концепции, предназначенные только для экспозиции, используются для нескольких типов, но они не являются частью интерфейса стандартной библиотеки.

(Примечание: В данном HTML-фрагменте отсутствует текстовое содержимое для перевода, только структурные элементы таблицы. Все теги и атрибуты сохранены в оригинальном виде в соответствии с инструкциями.)
template < class R >

concept /*простое представление*/ =
ranges:: view < R > && ranges:: range < const R > &&
std:: same_as < ranges:: iterator_t < R > , ranges:: iterator_t < const R >> &&

std:: same_as < ranges:: sentinel_t < R > , ranges:: sentinel_t < const R >> ;
(1) ( только для демонстрации* )
template < class I >

concept /*has-arrow*/ =
ranges :: input_iterator < I > &&

( std:: is_pointer_v < I > || requires ( const I i ) { i. operator - > ( ) ; } ) ;
(2) ( только для демонстрации* )
template < class T, class U >

concept /*отличается-от*/ =

! std:: same_as < std:: remove_cvref_t < T > , std:: remove_cvref_t < U >> ;
(3) ( только для демонстрации* )
template < class R >

concept /*диапазон-с-перемещаемыми-ссылками*/ =
ranges:: input_range < R > &&
std:: move_constructible < ranges:: range_reference_t < R >> &&

std:: move_constructible < ranges:: range_rvalue_reference_t < R >> ;
(4) ( только для демонстрации* )
template < bool C, class ... Views >

концепт /*all-random-access*/ =
( ranges:: random_access_range

< std:: conditional_t < C, const Views, Views >> && ... ) ;
(5) ( только для демонстрации* )
template < bool C, class ... Views >

концепт /*all-bidirectional*/ =
( ranges:: bidirectional_range

< std:: conditional_t < C, const Views, Views >> && ... ) ;
(6) ( только для демонстрации* )
template < bool C, class ... Views >

концепт /*all-forward*/ =
( ranges:: forward_range

< std:: conditional_t < C, const Views, Views >> && ... ) ;
(7) ( только для демонстрации* )

Примечания

**Примечание:** В данном фрагменте HTML: - Все HTML-теги и атрибуты сохранены без изменений - Текст внутри тегов ` ` и `
` не переведен
- C++ специфические термины (`ranges::range_adaptor_closure`) сохранены в оригинале
- Форматирование полностью сохранено
Перевод не требуется, так как весь значимый текст уже представлен в виде кода или C++ терминов, которые не подлежат переводу согласно инструкциям.
**Примечание:** В данном HTML-фрагменте весь текст уже находится внутри тегов ` `, ` ` и других элементов, которые содержат технические термины C++ и код. Согласно вашим инструкциям, такой текст не подлежит переводу. Поэтому весь фрагмент остается без изменений. **Примечание:** В данном HTML-фрагменте весь текст уже находится внутри тегов ` `, ` ` с классами кода, или является C++ специфичными терминами, которые не подлежат переводу согласно вашим требованиям. Поэтому перевод не требуется - весь текст сохранен в оригинальном виде. **Примечание:** В данном фрагменте HTML не содержится переводимого текста за пределами тегов ` `, `
` и ``. Все элементы, требующие перевода (такие как заголовки страниц, описания и т.д.), отсутствуют в предоставленном коде. C++ специфические термины и HTML разметка сохранены в оригинальном виде согласно требованиям.
**Примечание:** В данном фрагменте HTML не содержится переводимого текста за пределами тегов ` `, `
` и ``. Все элементы, требующие перевода (такие как атрибуты `title`), уже представлены на английском языке и не подлежат изменению согласно вашим инструкциям. C++ специфические термины (`ranges::stride_view`, `__cpp_lib_ranges_stride`) также сохранены в оригинале.
**Примечание:** В данном HTML-фрагменте отсутствует текст для перевода на русский язык. Все содержимое состоит из: - HTML-тегов и атрибутов (не подлежат переводу) - Кода внутри тегов ` ` (не подлежит переводу) - C++ специфических терминов (не подлежат переводу) - Технических идентификаторов и значений Единственный потенциально переводимый элемент `(C++23)` уже является стандартным обозначением версии языка и не требует перевода.
Макрос проверки возможностей Значение Стандарт Функция
__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-квалифицирован требует

Смотрите также