Namespaces
Variants

std::ranges::views::elements, std::ranges::elements_view

Из ru.cppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 
 
Определён в заголовке <ranges>
template< ranges::input_range V, std::size_t N >
    requires ranges::view<V> &&
             /*has-tuple-element*/<ranges::range_value_t<V>, N> &&
             /*has-tuple-element*/<std::remove_reference_t<
                                       ranges::range_reference_t<V>>, N> &&
             /*returnable-element*/<ranges::range_reference_t<V>, N>
class elements_view
    : public ranges::view_interface<elements_view<V, N>>;
(1) (начиная с C++20)
namespace views {
    template< std::size_t N >
    constexpr /* unspecified */ elements = /* unspecified */;
}
(2) (начиная с C++20)
Сигнатура вызова
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto elements<N>( R&& r );
(начиная с C++20)
Вспомогательные концепты
template< class T, std::size_t N >
concept /*has-tuple-element*/ =
    requires(T t) {
        typename std::tuple_size<T>::type;
        requires N < std::tuple_size_v<T>;
        typename std::tuple_element_t<N, T>;
        { std::get<N>(t) } -> std::convertible_to<
                                  const std::tuple_element_t<N, T>&>;
    };
(3) (до C++23)
(только для пояснения*)
template< class T, std::size_t N >
concept /*has-tuple-element*/ =
    /*tuple-like*/<T> && N < std::tuple_size_v<T>
(начиная с C++23)
(только для пояснения*)
template< class T, std::size_t N >
concept returnable-element =
     std::is_reference_v<T> || std::move_constructible<
                                       std::tuple_element_t<N, T>>;
(4) (только для пояснения*)
1) Принимает view кортежеподобных значений и возвращает представление с типом значения, равным N-му элементу типа значения адаптированного представления.
2) Каждая специализация views::elements является RangeAdaptorObject. Выражение views::elements<M>(e) является выражением-эквивалентом для elements_view<views::all_t<decltype((e))>, M>{e} для любого подходящего подвыражения e и константного выражения M.
3) Обеспечивает, что элементы базового представления являются кортежеподобными значениями, см. tuple-like(начиная с C++23).
4) Обеспечивает, что "повисшие" ссылки не могут быть возвращены.

elements_view моделирует концепции random_access_range, bidirectional_range, forward_range, input_range, common_range и sized_range, когда базовое представление V моделирует соответствующие концепции.

Члены данных

Участник Описание
V base_ базовое представление
( объект-член только для демонстрации* )

Функции-члены

конструирует elements_view
(публичная функция-член)
возвращает копию базового (адаптированного) представления
(публичная функция-член)
возвращает итератор на начало
(публичная функция-член)
возвращает итератор или страж на конец
(публичная функция-член)
возвращает количество элементов, предоставляется только если базовый (адаптированный) диапазон удовлетворяет sized_range
(публичная функция-член)
возвращает приблизительный размер результирующего approximately_sized_range
(публичная функция-член)
Унаследовано от ranges::view_interface
возвращает, пусто ли производное представление, применимо только если оно удовлетворяет sized_range или forward_range
(открытый элемент-функция std::ranges::view_interface<D>)
(C++23)
возвращает константный итератор на начало диапазона
(открытый элемент-функция std::ranges::view_interface<D>)
(C++23)
возвращает сторожевой элемент для константного итератора диапазона
(открытый элемент-функция std::ranges::view_interface<D>)
возвращает, не пусто ли производное представление, применимо только если к нему применим ranges::empty
(открытый элемент-функция std::ranges::view_interface<D>)
возвращает первый элемент в производном представлении, применимо если оно удовлетворяет forward_range
(открытый элемент-функция std::ranges::view_interface<D>)
возвращает последний элемент в производном представлении, применимо только если оно удовлетворяет bidirectional_range и common_range
(открытый элемент-функция std::ranges::view_interface<D>)
возвращает n-ый элемент в производном представлении, применимо только если оно удовлетворяет random_access_range
(открытый элемент-функция std::ranges::view_interface<D>)

Вложенные классы

тип итератора
( демонстрационный шаблон класса-члена* )
тип сторожа
( демонстрационный шаблон класса-члена* )

Вспомогательные шаблоны

template < class T, std:: size_t N >

constexpr bool enable_borrowed_range < std :: ranges :: elements_view < T, N >> =

ranges:: enable_borrowed_range < T > ;
(начиная с C++20)

Эта специализация ranges::enable_borrowed_range позволяет elements_view удовлетворять требованиям borrowed_range , когда базовое представление удовлетворяет этим требованиям.

Пример

#include <iostream>
#include <ranges>
#include <string>
#include <tuple>
#include <vector>
int main()
{
    const std::vector<std::tuple<int, char, std::string>> vt
    {
        {1, 'A', "α"},
        {2, 'B', "β"},
        {3, 'C', "γ"},
        {4, 'D', "δ"},
        {5, 'E', "ε"},
    };
    for (int const e : std::views::elements<0>(vt))
        std::cout << e << ' ';
    std::cout << '\n';
    for (char const e : vt | std::views::elements<1>)
        std::cout << e << ' ';
    std::cout << '\n';
    for (std::string const& e : std::views::elements<2>(vt))
        std::cout << e << ' ';
    std::cout << '\n';
}

Вывод:

1 2 3 4 5
A B C D E
α β γ δ ε

Отчеты о дефектах

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

DR Applied to Behavior as published Correct behavior
LWG 3494 C++20 elements_view was never a borrowed_range it is a borrowed_range
if its underlying view is
LWG 3502 C++20 dangling reference could be obtained from elements_view such usage is forbidden

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

принимает view состоящий из пароподобных значений и создаёт view первых элементов каждой пары
(шаблон класса) (объект адаптера диапазона)
принимает view состоящий из пароподобных значений и создаёт view вторых элементов каждой пары
(шаблон класса) (объект адаптера диапазона)
view состоящий из кортежей ссылок на соответствующие элементы адаптированных представлений
(шаблон класса) (объект точки кастомизации)
view состоящий из результатов применения функции преобразования к соответствующим элементам адаптированных представлений
(шаблон класса) (объект точки кастомизации)
BLAS-подобный срез valarray: начальный индекс, длина, шаг
(класс)