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

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

Материал из cppreference.com
< cpp
 
 
 

Библиотека диапазонов предоставляет компоненты для работы с диапазонами элементов, включая различные адаптеры представлений.

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

    namespace views = ranges::views;

}

Псевдоним пространства имён 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>> к соответствующему входному потоку
(шаблон класса) [править]

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

Адаптеры диапазонов принимают viewable_range в качестве своих первых аргументов и возвращают view.

Если адаптер принимает только один аргумент, его также можно вызвать с помощью оператора конвейера: если C это объект адаптера диапазона, а Rviewable_range, эти два выражения эквивалентны:

C(R)
R | C

Унарные адаптеры диапазона также могут быть объединены в цепочку для создания другого адаптера диапазона: если C и D являются объектами адаптера диапазона, а Rviewable_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
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 в common_range
(шаблон класса) (объект адаптера диапазона) [править]
view, который перебирает элементы другого двунаправленного представления в обратном порядке
(шаблон класса) (объект адаптера диапазона) [править]
принимает view, состоящий из значений, подобных кортежу, и числа N, и создаёт view из N-го элемента каждого кортежа
(шаблон класса) (объект адаптера диапазона) [править]
принимает view, состоящий из парных значений, и создаёт view первых элементов каждой пары
(шаблон класса) (объект адаптера диапазона) [править]
принимает view, состоящий из парных значений, и создаёт view из вторых элементов каждой пары
(шаблон класса) (объект адаптера диапазона) [править]

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

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

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

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>>;
template<class T, class U>

  concept __NotSameAs =                          // только разъяснение

    !std::same_as<std::remove_cvref_t<T>, std::remove_cvref_t<U>>;

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

#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