Библиотека диапазонов (C++20)
Библиотека диапазонов предоставляет компоненты для работы с диапазонами элементов, включая различные адаптеры представлений.
| Определено в заголовочном файле <ranges>
|
||
| namespace std { namespace views = ranges::views; |
||
Псевдоним пространства имён std::views предоставляется как сокращение для std::ranges::views.
| Определены в пространстве имён
std::ranges | ||
Доступ к диапазону | ||
| Определены в заголовочном файле
<ranges> | ||
| Определены в заголовочном файле
<iterator> | ||
| (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) |
получает указатель на начало непрерывного диапазона, доступного только для чтения (объект точки настройки) | |
Примитивы диапазонов | ||
| Определены в заголовочном файле
<ranges> | ||
| получает связанные типы диапазона (псевдоним шаблона) | ||
Обработка висячих итераторов | ||
| Определены в заголовочном файле
<ranges> | ||
| (C++20) |
тип заполнителя, указывающий, что итератор или поддиапазон не должны быть возвращены, так как они будут висячими (класс) | |
получает тип итератора или тип поддиапазона из borrowed_range (псевдоним шаблона) | ||
Концепты диапазонов | ||
| Определены в заголовочном файле
<ranges> | ||
| (C++20) |
указывает, что тип является диапазоном, то есть предоставляет итератор begin и ограничитель end (концепт) | |
| (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) |
указывает, что диапазон имеет идентичные типы итератора и ограничителя (концепт) | |
| (C++20) |
определяет требования к range для безопасного преобразования в view (концепт) | |
Представления | ||
| Определены в заголовочном файле
<ranges> | ||
| (C++20) |
шаблон вспомогательного класса для определения view, используя любопытно повторяющийся образец шаблон (шаблон класса) | |
| (C++20) |
объединяет пару итератор-ограничитель в view (шаблон класса) | |
[править] Фабрики диапазонов
| Определены в заголовочном файле
<ranges> | |
| Определены в пространстве имён
std::ranges | |
| пустой view без элементов (шаблон класса) (шаблонная переменная) | |
| view, который содержит единственный элемент указанного значения (шаблон класса) (объект точки настройки) | |
| (C++20) |
view, состоящий из последовательности, сгенерированной путём многократного увеличения начального значения (шаблон класса) (объект точки настройки) |
| view состоящий из элементов, полученных последовательным применением operator>> к соответствующему входному потоку (шаблон класса) | |
[править] Адаптеры диапазонов
Адаптеры диапазонов принимают viewable_range в качестве своих первых аргументов и возвращают view.
Если адаптер принимает только один аргумент, его также можно вызвать с помощью оператора конвейера: если C это объект адаптера диапазона, а R – viewable_range, эти два выражения эквивалентны:
C(R) R | C
Унарные адаптеры диапазона также могут быть объединены в цепочку для создания другого адаптера диапазона: если C и D являются объектами адаптера диапазона, а R – viewable_range, то C | D также является объектом адаптера диапазона, и эти два выражения эквивалентны:
R | C | D // (R | C) | D R | (C | D)
Если адаптер принимает несколько аргументов, эти формы эквивалентны:
adaptor(range, args...) adaptor(args...)(range) range | adaptor(args...)
В этом случае adaptor(args...) это объект унарного адаптера диапазона.
| Определены в заголовочном файле
<ranges> | |
| Определены в пространстве имён
std::ranges | |
| (C++20) |
view, который включает все элементы range (псевдоним шаблона) (объект адаптера диапазона) |
| (C++20) |
view из элементов некоторого другого range (шаблон класса) |
| view, который состоит из элементов range, который соответствует предикату (шаблон класса) (объект адаптера диапазона) | |
| view последовательности, которая применяет функцию преобразования к каждому элементу (шаблон класса) (объект адаптера диапазона) | |
| (C++20) |
view, состоящий из первых N элементов другого view (шаблон класса) (объект адаптера диапазона) |
| view, состоящий из начальных элементов другого view, до первого элемента, для которого предикат не вернёт false (шаблон класса) (объект адаптера диапазона) | |
| (C++20) |
view, состоящий из элементов другого view, пропуская первые N элементов (шаблон класса) (объект адаптера диапазона) |
| view, состоящий из элементов другого view, пропуская начальную подпоследовательность элементов до первого элемента, для которого предикат вернет false (шаблон класса) (объект адаптера диапазона) | |
| (C++20) |
view, состоящий из последовательности, полученной уплотнением view, состоящего из range (шаблон класса) (объект адаптера диапазона) |
| view по поддиапазонам, полученным в результате разделения другого view с использованием разделителя (шаблон класса) (объект адаптера диапазона) | |
| (C++20) |
создаёт поддиапазон из итератора и счётчика (объект точки настройки) |
| преобразует view в common_range (шаблон класса) (объект адаптера диапазона) | |
| view, который перебирает элементы другого двунаправленного представления в обратном порядке (шаблон класса) (объект адаптера диапазона) | |
| принимает view, состоящий из значений, подобных кортежу, и числа N, и создаёт view из N-го элемента каждого кортежа (шаблон класса) (объект адаптера диапазона) | |
| (C++20) |
принимает view, состоящий из парных значений, и создаёт view первых элементов каждой пары (шаблон класса) (объект адаптера диапазона) |
| принимает view, состоящий из парных значений, и создаёт view из вторых элементов каждой пары (шаблон класса) (объект адаптера диапазона) | |
Некоторые адаптеры диапазонов заключают свой элемент или объект функцию в полурегулярную оболочку.
[править] Вспомогательные концепты
Следующие концепты только для описания и используются для нескольких типов, но они не являются частями интерфейса стандартной библиотеки.
| template<class R> concept __SimpleView = // только разъяснение |
||
| template<class T, class U> concept __NotSameAs = // только разъяснение |
||
[править] Пример
#include <ranges> #include <iostream> 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

