Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
Определено в заголовочном файле <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 обозначает 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
(публичная функция-член)
Наследуется от std::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> )

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

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

(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-го элемента каждого кортежа
(шаблон класса) (объект адаптера диапазона)