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 >
    inline 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)
Вспомогательные концепции
(3)
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>&>;
    };
(до 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 моделирует соответствующие концепции.

Члены-функции

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

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

iterator
(C++20)
тип итератора
(только для демонстрации, шаблон вложенного класса*)
sentinel
(C++20)
тип конечного маркера
(только для демонстрации, шаблон вложенного класса*)

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

template<class T, std::size_t N>
inline constexpr bool enable_borrowed_range<std::ranges::elements_view<T, N>> =
    std::ranges::enable_borrowed_range<T>;
(с C++20)

Эта специализация std::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/w/cpp/ranges/elements_view

Spec-Zone.ru

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