Spec-Zone.ru › C++

std::ranges::views::enumerate, std::ranges::enumerate_view

Определён в заголовочном файле <ranges>
template< ranges::view V >
    requires /*range-with-movable-references*/<V>
class enumerate_view
    : public ranges::view_interface<enumerate_view<V>>
(1) (начиная с C++23)
namespace views {
    inline constexpr /* unspecified */ enumerate = /* unspecified */;
}
(2) (начиная с C++23)
Сигнатура вызова
template< ranges::viewable_range R >
    requires /* see below */
constexpr /* see below */ enumerate( R&& r );
(начиная с C++23)
Вспомогательные концепции
template< class R >
    concept /*range-with-movable-references*/ =
        ranges::input_range<R> &&
        std::move_constructible<ranges::range_reference_t<R>> &&
        std::move_constructible<ranges::range_rvalue_reference_t<R>>;
(3) (только для экспозиции*)
1) enumerate_view — это адаптер диапазона, который принимает view и создаёт представление из tuple. В i-м элементе (кортеже) полученной последовательности содержатся:
  • значение, равное i, то есть индекс элемента базовой последовательности, отсчитываемый от нуля, и
  • ссылка на базовый элемент.
2) Имя views::enumerate обозначает объект-адаптер диапазона. Для подвыражения e выражение views::enumerate(e) эквивалентно выражению enumerate_view<views::all_t<decltype((e))>>(e) для любого подходящего подвыражения e.
3) Гарантирует, что тип ссылки базового типа допускает перемещение.

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

Члены-данные

Член Описание
V base_ итератор базового view
(объект-член, предназначенный только для экспозиции*)

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

(конструктор)
создаёт enumerate_view
(открытая функция-член)
base
возвращает копию базового (адаптированного) представления
(открытая функция-член)
begin
возвращает итератор на начало
(открытая функция-член)
end
возвращает итератор или sentinel на конец
(открытая функция-член)
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)
возвращает sentinel для константного итератора диапазона
(открытая функция-член 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
(C++23)
тип итератора
(шаблон класса-члена, предназначенный только для экспозиции*)
sentinel
(C++23)
тип sentinel
(шаблон класса-члена, предназначенный только для экспозиции*)

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

template< class View >
constexpr bool enable_borrowed_range<ranges::enumerate_view<View>> =
    ranges::enable_borrowed_range<View>;
(начиная с C++23)

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

Примечания

Макрос проверки поддержки возможностей Значение Стандарт Возможность
__cpp_lib_ranges_enumerate 202302L (C++23) std::ranges::enumerate_view

Пример

#include <initializer_list>
#include <iostream>
#include <map>
#include <ranges>
#include <vector>

int main()
{
    constexpr static auto v = {'A', 'B', 'C', 'D'};

    for (auto const [index, letter] : std::views::enumerate(v))
        std::cout << '(' << index << ':' << letter << ") ";
    std::cout << '\n';

#if __cpp_lib_ranges_to_container
    // create a map using the position of each element as key
    auto m = v | std::views::enumerate | std::ranges::to<std::map>();

    for (auto const [key, value] : m)
        std::cout << '[' << key << "]:" << value << ' ';
    std::cout << '\n';
#endif

    std::vector<int> numbers{1, 3, 5, 7};

    // num is mutable even with const, which does not propagate to reference to
    // make it const, use `std::views::enumerate(numbers) | std::views::as_const`
    // or `std::views::enumerate(std::as_const(numbers))`
    for (auto const [index, num] : std::views::enumerate(numbers))
    {
        ++num; // the type is int&
        std::cout << numbers[index] << ' ';
    }
    std::cout << '\n';
}

Возможный вывод:

(0:A) (1:B) (2:C) (3:D)
[0]:A [1]:B [2]:C [3]:D
2 4 6 8

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2024):
    • 26.7.23 Представление enumerate [range.enumerate]

См. также

ranges::iota_viewviews::iota
(C++20)
view, состоящее из последовательности, полученной многократным увеличением начального значения
(шаблон класса) (объект-точка настройки)
views::indices
(C++26)
view, генерирующее последовательность возрастающих значений от 0 до n
(объект-точка настройки)
ranges::zip_viewviews::zip
(C++23)
view, состоящее из кортежей ссылок на соответствующие элементы адаптированных представлений
(шаблон класса) (объект-точка настройки)
ranges::elements_viewviews::elements
(C++20)
принимает view, состоящее из значений tuple-like, и число N, после чего создаёт view из N-го элемента каждого кортежа
(шаблон класса) (объект-адаптер диапазона)

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

Spec-Zone.ru

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