Spec-Zone.ru › C++

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

Определён в заголовочном файле <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
(открытая функция-член)
base
возвращает копию базового (адаптированного) представления
(открытая функция-член)
begin
возвращает итератор на начало
(открытая функция-член)
end
возвращает итератор или сентинел на конец
(открытая функция-член)
size
возвращает количество элементов; доступна только в том случае, если базовый (адаптированный) диапазон удовлетворяет концепту sized_range
(открытая функция-член)
reserve_hint
(C++26)
возвращает приблизительный размер полученного approximately_sized_range
(открытая функция-член)
Унаследовано от std::ranges::view_interface
empty
возвращает признак того, что производное представление пусто; доступна только в том случае, если оно удовлетворяет концепту sized_range или forward_range
(открытая функция-член std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает константный итератор на начало диапазона
(открытая функция-член std::ranges::view_interface<D>)
cend
(C++23)
возвращает сентинел для константного итератора диапазона
(открытая функция-член std::ranges::view_interface<D>)
operator bool
возвращает признак того, что производное представление не пусто; доступна только в том случае, если к нему применим ranges::empty
(открытая функция-член std::ranges::view_interface<D>)
front
возвращает первый элемент производного представления, если оно удовлетворяет концепту forward_range
(открытая функция-член std::ranges::view_interface<D>)
back
возвращает последний элемент производного представления; доступна только в том случае, если оно удовлетворяет концептам bidirectional_range и common_range
(открытая функция-член std::ranges::view_interface<D>)
operator[]
возвращает n-й элемент производного представления; доступна только в том случае, если оно удовлетворяет концепту random_access_range
(открытая функция-член std::ranges::view_interface<D>)

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

iterator
тип итератора
(шаблон класса-члена только для пояснения*)
sentinel
тип сентинела
(шаблон класса-члена только для пояснения*)

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

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++.

Отчёт об ошибке Применён к Опубликованное поведение Исправленное поведение
LWG 3494 C++20 elements_view никогда не являлся borrowed_range он является borrowed_range
если его базовое представление является таковым
LWG 3502 C++20 из elements_view можно было получить висячую ссылку такое использование запрещено

См. также

ranges::keys_viewviews::keys
(C++20)
принимает view, состоящее из значений, подобных парам, и создаёт view из первых элементов каждой пары
(шаблон класса) (объект-адаптер диапазона)
ranges::values_viewviews::values
(C++20)
принимает view, состоящее из значений, подобных парам, и создаёт view из вторых элементов каждой пары
(шаблон класса) (объект-адаптер диапазона)
ranges::zip_viewviews::zip
(C++23)
view, состоящее из кортежей ссылок на соответствующие элементы адаптированных представлений
(шаблон класса) (объект точки настройки)
ranges::zip_transform_viewviews::zip_transform
(C++23)
view, состоящее из результатов применения функции преобразования к соответствующим элементам адаптированных представлений
(шаблон класса) (объект точки настройки)
slice
срез valarray, подобный срезу BLAS: начальный индекс, длина, шаг
(класс)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/elements_view

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API