Namespaces
Variants

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

С ru.cppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 
 
Определён в заголовке <ranges>
template< ranges::view V >
    requires /*range-with-movable-references*/<V>
class enumerate_view
    : public ranges::view_interface<enumerate_view<V>>
(1) (since C++23)
namespace views {
    inline constexpr /* unspecified */ enumerate = /* unspecified */;
}
(2) (since C++23)
Сигнатура вызова
template< ranges::viewable_range R >
    requires /* see below */
constexpr /* see below */ enumerate( R&& r );
(since 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 и создаёт представление из std::tuple. iй элемент (кортеж) результирующей последовательности содержит:
  • значение, равное i, которое является индексом элемента базовой последовательности, начинающимся с нуля, и
  • ссылку на базовый элемент.
2) Имя views::enumerate обозначает RangeAdaptorObject. Для подвыражения 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, common_range, и sized_range когда базовое представление V моделирует соответствующие концепции.

Члены данных

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

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

конструирует enumerate_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)
возвращает дозорный (sentinel) для константного итератора диапазона
(открытая функция-член 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>)

Руководства по выводу

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

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

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

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
    // создать map, используя позицию каждого элемента как ключ
    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 изменяем даже с const, что не распространяется на ссылку
    // чтобы сделать его const, используйте `std::views::enumerate(numbers) | std::views::as_const`
    // или `std::views::enumerate(std::as_const(numbers))`
    for (auto const [index, num] : std::views::enumerate(numbers))
    {
        ++num; // тип - 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]

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

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