The Wayback Machine - https://web.archive.org/web/20220419001112/https://ru.cppreference.com/w/cpp/ranges
Пространства имён
Варианты
Действия

Библиотека диапазонов (C++20)

Материал из cppreference.com
< cpp
 
C++
Поддержка компилятором
Автономные и размещённые реализации
Язык
Заголовки стандартной библиотеки
Требования к именованию
Макросы тестирования функциональности (C++20)
Поддержка языка
Библиотека концептов (C++20)
Библиотека метапрограммирования (C++11)
Библиотека диагностики
Библиотека общих утилит
Библиотека строк
Библиотека контейнеров
Библиотека итераторов
Библиотека диапазонов (C++20)
Библиотека алгоритмов
Библиотека численных данных
Библиотека ввода/вывода
Библиотека локализаций
Регулярные выражения (C++11)
Атомарные операции (C++11)
Библиотека поддержки конкуренции (C++11)
Библиотека файловой системы (C++17)
Технические спецификации
Указатель символов
Внешние библиотеки
 
Библиотека диапазонов
Доступ к диапазонам
Преобразования диапазонов
(C++23)
Примитивы диапазонов
Обработка висячих итераторов
Концепты диапазонов
Представления

Фабрики
Адаптеры
Объекты адаптеров диапазонов
Объекты замыкания адаптеров диапазонов
Вспомогательные элементы
 

Библиотека диапазонов является расширением и обобщением библиотек алгоритмов и итераторов, что делает их более мощными, составными и менее подверженным ошибкам.

Библиотека создаёт и управляет представлениями диапазонов, облегчёнными объектами, которые косвенно представляют итерируемые последовательности (диапазонов). Диапазоны это абстракция над

  • пары итераторов [начало, конец), например диапазоны, созданные неявным преобразованием из контейнеров. Все алгоритмы, использующие пары итераторов, теперь имеют перегрузки, которые принимают диапазоны (например, ranges::sort)
  • подсчитанные последовательности [начало, размер), Ñ‚.е. диапазон, возвращённый views::counted
  • условно-завершённые последовательности [начало, предикат), например диапазон, возвращаемый views::take_while
  • неограниченные последовательности [начало..), например диапазон, возвращённый views::iota

Библиотека диапазонов включает алгоритмы диапазонов, которые применяются к диапазонам активно, и адаптеры диапазонов, которые применяются к представлениям лениво. Адаптеры могут быть объединены в конвейеры, чтобы их действия происходили по мере повторения представления.

Определено в заголовочном файле <ranges>
namespace std {

    namespace views = ranges::views;

}
(начиная с C++20)

Псевдоним пространства имён std::views предоставляется как сокращение для std::ranges::views.

Определены в пространстве имён std::ranges

Содержание

Доступ к диапазонам
Определены в заголовочном файле <ranges>
Определены в заголовочном файле <iterator>
возвращает итератор на начало диапазона
(объект точки настройки) [править]
возвращает ограничитель, указывающий на конец диапазона
(объект точки настройки) [править]
возвращает итератор на начало диапазона только для чтения
(объект точки настройки) [править]
возвращает ограничитель, указывающий на конец диапазона, доступного только для чтения
(объект точки настройки) [править]
возвращает обратный итератор на диапазон
(объект точки настройки) [править]
возвращает обратный конечный итератор диапазона
(объект точки настройки) [править]
возвращает обратный итератор на диапазон только для чтения
(объект точки настройки) [править]
возвращает обратный конечный итератор на диапазон только для чтения
(объект точки настройки) [править]
возвращает целое число, равное размеру диапазона
(объект точки настройки) [править]
возвращает целое число со знаком, равное размеру диапазона
(объект точки настройки) [править]
проверяет, пуст ли диапазон
(объект точки настройки) [править]
получает указатель на начало непрерывного диапазона
(объект точки настройки) [править]
получает указатель на начало непрерывного диапазона, доступного только для чтения
(объект точки настройки) [править]
Примитивы диапазонов
Определены в заголовочном файле <ranges>
получает связанные типы диапазона
(псевдоним шаблона) [править]
Обработка висячих итераторов
Определены в заголовочном файле <ranges>
тип заполнителя, указывающий, что итератор или поддиапазон не должны быть возвращены, так как они будут висячими
(класс) [править]
получает тип итератора или тип поддиапазона из borrowed_range
(псевдоним шаблона) [править]
Концепты диапазонов
Определены в заголовочном файле <ranges>
указывает, что тип является диапазоном, то есть предоставляет итератор begin и ограничитель end
(концепт) [править]
указывает, что тип является range, и итераторы, полученные из его выражения, могут быть безопасно возвращены без опасности зависания
(концепт) [править]
указывает, что диапазон узнаёт свой размер за константное время
(концепт) [править]
указывает, что диапазон является представлением, то есть имеет постоянное время копирования/перемещения/присваивания
(концепт) [править]
указывает диапазон, тип итератора которого соответствует input_iterator
(концепт) [править]
указывает диапазон, тип итератора которого соответствует output_iterator
(концепт) [править]
указывает диапазон, тип итератора которого соответствует forward_iterator
(концепт) [править]
указывает диапазон, тип итератора которого соответствует bidirectional_iterator
(концепт) [править]
указывает диапазон, тип итератора которого соответствует random_access_iterator
(концепт) [править]
указывает диапазон, тип итератора которого соответствует contiguous_iterator
(концепт) [править]
указывает, что диапазон имеет идентичные типы итератора и ограничителя
(концепт) [править]
определяет требования к range для безопасного преобразования в view
(концепт) [править]
Представления
Определены в заголовочном файле <ranges>
шаблон вспомогательного класса для определения view, используя любопытно повторяющийся образец шаблон
(шаблон класса) [править]
объединяет пару итератор-ограничитель в view
(шаблон класса) [править]

[править] Фабрики диапазонов

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

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

Определены в заголовочном файле <ranges>
Определены в пространстве имён std::ranges
view, который включает все элементы range
(псевдоним шаблона) (объект адаптера диапазона) [править]
view из элементов некоторого другого range
(шаблон класса) [править]
view с уникальным владельцем некоторого range
(шаблон класса) [править]
view, который состоит из элементов range, который соответствует предикату
(шаблон класса) (объект адаптера диапазона) [править]
view последовательности, которая применяет функцию преобразования к каждому элементу
(шаблон класса) (объект адаптера диапазона) [править]
view, состоящий из первых N элементов другого view
(шаблон класса) (объект адаптера диапазона) [править]
view, состоящий из начальных элементов другого view, до первого элемента, для которого предикат не вернёт false
(шаблон класса) (объект адаптера диапазона) [править]
view, состоящий из элементов другого view, пропуская первые N элементов
(шаблон класса) (объект адаптера диапазона) [править]
view, состоящий из элементов другого view, пропуская начальную подпоследовательность элементов до первого элемента, для которого предикат вернет false
(шаблон класса) (объект адаптера диапазона) [править]
view, состоящий из последовательности, полученной уплотнением view, состоящего из range
(шаблон класса) (объект адаптера диапазона) [править]
view по поддиапазонам, полученным в результате разделения другого view с использованием разделителя
(шаблон класса) (объект адаптера диапазона) [править]
view по поддиапазонам, полученным в результате разделения другого view с использованием разделителя
(шаблон класса) (объект адаптера диапазона) [править]
создаёт поддиапазон из итератора и счётчика
(объект точки настройки) [править]
преобразует view в common_range
(шаблон класса) (объект адаптера диапазона) [править]
view, который перебирает элементы другого двунаправленного представления в обратном порядке
(шаблон класса) (объект адаптера диапазона) [править]
принимает view, состоящий из значений, подобных кортежу, и числа N, и создаёт view из N-го элемента каждого кортежа
(шаблон класса) (объект адаптера диапазона) [править]
принимает view, состоящий из парных значений, и создаёт view первых элементов каждой пары
(шаблон класса) (объект адаптера диапазона) [править]
принимает view, состоящий из парных значений, и создаёт view из вторых элементов каждой пары
(шаблон класса) (объект адаптера диапазона) [править]
view, состоящий из кортежей ссылок на соответствующие элементы адаптированных представлений
(шаблон класса) (объект точки настройки) [править]
view, состоящий из кортежей результатов применения функции преобразования к соответствующим элементам адаптированных представлений
(шаблон класса) (объект точки настройки) [править]
view, состоящий из кортежей ссылок на соседние элементы адаптированного представления
(шаблон класса) (объект адаптера диапазона) [править]
view, состоящий из кортежей результатов применения функции преобразования к смежным элементам адаптированного представления
(шаблон класса) (объект адаптера диапазона) [править]

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

[править] Объекты адаптеров диапазонов

Объекты адаптеров диапазонов это объекты точки настройки, которые принимают viewable_range в качестве своих первых аргументов и возвращают view. Некоторые объекты адаптеров диапазонов являются унарными, т.е. они принимают один viewable_range в качестве единственного аргумента. Другие объекты адаптеров диапазонов принимают viewable_range и другие завершающие аргументы.

Если объект адаптера диапазона принимает более одного аргумента, он также поддерживает частичное применение:

  • пусть a будет таким объектом адаптера диапазона, и
  • args... будет аргументами (обычно подходит для завершающих аргументов),

выражение a(args...) имеет следующие свойства:

  • оно действительно тогда и только тогда, когда для каждого аргумента e в args... такого что E равно decltype((e)), std::is_constructible_v<std::decay_t<E>, E> равно true,
  • когда вызов действителен, его объект результата сохраняет подобъект типа std::decay_t<E> инициализированный напрямую без списка с помощью std::forward<E>(e), для каждого аргумента e в args... (другими словами, объекты адаптеров диапазонов связывают аргументы по значению), и
  • объект результата это объект замыкания адаптера диапазона (смотрите ниже).

Как и другие объекты точки настройки, пусть

  • a будет объектом cv-неквалифицированной версии типа любых объектов адаптеров диапазонов,
  • args... будет любой группой аргументов, соответствующих ограничениям operator() типа a,

вызовы

  • a(args...),
  • std::as_const(a)(args...),
  • std::move(a)(args...), and
  • std::move(std::as_const(a))(args...)

эквивалентны.

Объектом результата каждого из этих выражений является либо объект view, либо объект замыкания адаптера диапазона.

Примечания: operator() не поддерживается для версий типов объектов адаптеров диапазонов, квалифицированных как volatile или const volatile. При связывании массивы и функции преобразуются в указатели.

[править] Объекты замыкания адаптеров диапазонов

Объекты замыкания адаптеров диапазонов это объекты, тип которых совпадает с типом одного из следующих объектов (без учёта cv-квалификации):

  • унарные объекты адаптеров диапазонов,
  • результаты привязки конечных аргументов объектами адаптеров диапазонов, и
  • результаты объединения двух объектов замыкания адаптеров диапазонов с помощью operator|.

Объекты замыкания адаптеров диапазонов принимают один viewable_range в качестве единственного аргумента и возвращают view. Их можно вызвать с помощью оператора конвейера: если C объект замыкания адаптера диапазона, а R это viewable_range, эти два выражения эквивалентны:

C(R)
R | C

Этот вызов перенаправляет связанные аргументы (если есть) в связанный объект адаптера диапазона. В этом вызове связанные аргументы в C (если есть) идентично обрабатываются как левостороннее или правостороннее значение и cv-квалифицированы как C.

Два объекта замыкания адаптеров диапазонов могут быть связаны с помощью operator| для создания другого объекта замыкания адаптеров диапазонов: если C и D являются объектами замыкания адаптеров диапазонов, то C | D также является объектом замыкания адаптеров диапазонов, если это допустимо.

Связанные аргументы C | D определяются следующим образом:

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

Эффект и валидность результата operator() определяется следующим образом: при viewable_range R эти два выражения эквивалентны (оба правильно или неправильно сформированы):

R | C | D // (R | C) | D
R | (C | D)

Примечание: operator() не поддерживается для версий типов замыкания объектов адаптеров диапазонов с квалификацией volatile или const volatile.

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

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

template<class R>

  concept __SimpleView =                         // только разъяснение
    ranges::view<R> && ranges::range<const R> &&
    std::same_as<std::ranges::iterator_t<R>, std::ranges::iterator_t<const R>> &&

    std::same_as<std::ranges::sentinel_t<R>, std::ranges::sentinel_t<const R>>

[править] Примечание

Макрос тестирования функциональности: __cpp_lib_ranges

[править] Пример

#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

[править] Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 3509 C++20 было неясно, как объекты адаптеров диапазонов связывают конечные аргументы они связаны по значению
Источник — «https://ru.cppreference.com/mwiki/index.php?title=cpp/ranges&oldid=51702»