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

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

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

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

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

    namespace views = ranges::views;

}

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


Шаблон:cpp/ranges/dsc rendШаблон:cpp/ranges/dsc sizeШаблон:cpp/ranges/dsc emptyШаблон:cpp/ranges/dsc dataШаблон:cpp/ranges/dsc iterator tШаблон:cpp/ranges/dsc danglingШаблон:cpp/ranges/dsc borrowed iterator tШаблон:cpp/ranges/dsc RangeШаблон:cpp/ranges/dsc borrowed rangeШаблон:cpp/ranges/dsc SizedRangeШаблон:cpp/ranges/dsc ViewШаблон:cpp/ranges/dsc InputRangeШаблон:cpp/ranges/dsc OutputRangeШаблон:cpp/ranges/dsc ForwardRangeШаблон:cpp/ranges/dsc BidirectionalRangeШаблон:cpp/ranges/dsc RandomAccessRangeШаблон:cpp/ranges/dsc ContiguousRangeШаблон:cpp/ranges/dsc CommonRangeШаблон:cpp/ranges/dsc ViewableRangeШаблон:cpp/ranges/dsc view interfaceШаблон:cpp/ranges/dsc subrange
Заголовочный файл <ranges>
Пространство имён std::ranges

Содержание

Доступ к диапазонам
Возвращает итератор на начало диапазона
(объект точки настройки) [править]
(C++20)
Возвращает итератор на конец диапазона
(объект точки настройки) [править]
возвращает обратный итератор на диапазон
(объект точки настройки) [править]
Примитивы диапазона
Управление "повисшим" итератором
Концепция диапазона
Представления

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

Шаблон:cpp/ranges/dsc empty viewШаблон:cpp/ranges/dsc single viewШаблон:cpp/ranges/dsc iota viewШаблон:cpp/ranges/dsc view counted
Заголовочный файл <ranges>
Пространство имён std::ranges

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

Адаптеры диапазона принимают 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...) является объектом унарного диапазона.

Шаблон:cpp/ranges/dsc all viewШаблон:cpp/ranges/dsc ref viewШаблон:cpp/ranges/dsc filter viewШаблон:cpp/ranges/dsc transform viewШаблон:cpp/ranges/dsc take viewШаблон:cpp/ranges/dsc take while viewШаблон:cpp/ranges/dsc drop viewШаблон:cpp/ranges/dsc drop while viewШаблон:cpp/ranges/dsc join viewШаблон:cpp/ranges/dsc split viewШаблон:cpp/ranges/dsc common viewШаблон:cpp/ranges/dsc reverse viewШаблон:cpp/ranges/dsc basic istream viewШаблон:cpp/ranges/dsc elements viewШаблон:cpp/ranges/dsc keys viewШаблон:cpp/ranges/dsc values view
Заголовочный файл <ranges>
Пространство имён std::ranges

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

[править] Концепция помощника

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

template<class R>

  concept __SimpleView =                         // exposition only
    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 =                          // exposition only

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

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

#include <vector>
#include <ranges>
#include <iostream>
 
int main()
{
    std::vector<int> 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 << ' ';
    }
}

Вывод:

0 4 16
X Tutup