std::ranges:: views:: enumerate, std::ranges:: enumerate_view
|
Определено в заголовочном файле
<ranges>
|
||
|
template
<
ranges::
view
V
>
requires
/*range-with-movable-references*/
<
V
>
|
(1) | (начиная с C++23) |
|
namespace
views
{
inline
constexpr
/* unspecified */
enumerate
=
/* unspecified */
;
|
(2) | (начиная с C++23) |
|
Сигнатура вызова
|
||
|
template
<
ranges::
viewable_range
R
>
requires
/* see below */
|
(начиная с C++23) | |
|
Вспомогательные концепты
|
||
|
template
<
class
R
>
concept
/*range-with-movable-references*/
=
|
(3) | ( только для демонстрации* ) |
enumerate_view
— это адаптер диапазона, который принимает
view
и создает представление из
tuple
.
i
-й
элемент (кортеж) результирующей последовательности содержит:
-
значение, равное
i, которое представляет собой индекс элемента базовой последовательности, начинающийся с нуля, и - ссылку на базовый элемент.
views::enumerate
обозначает
RangeAdaptorObject
. Для данного подвыражения
e
, выражение
views
::
enumerate
(
e
)
является
эквивалентным по выражению
к
enumerate_view
<
views::
all_t
<
decltype
(
(
e
)
)
>>
(
e
)
для любого подходящего подвыражения
e
.
enumerate_view
моделирует концепции
random_access_range
,
bidirectional_range
,
forward_range
,
input_range
,
common_range
и
sized_range
, когда базовое представление
V
моделирует соответствующие концепции.
Содержание |
Члены данных
| Участник | Описание |
V
base_
|
итератор на базовый
view
( объект-член только для демонстрации* ) |
Функции-члены
конструирует
enumerate_view
(публичная функция-член) |
|
|
возвращает копию базового (адаптированного) представления
(публичная функция-член) |
|
|
возвращает итератор на начало
(публичная функция-член) |
|
|
возвращает итератор или страж на конец
(публичная функция-член) |
|
возвращает количество элементов, предоставляется только если базовый (адаптированный) диапазон удовлетворяет
sized_range
(публичная функция-член) |
|
|
(C++26)
|
возвращает приблизительный размер результирующего
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
>>
=
|
(начиная с 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]
Смотрите также
|
(C++20)
|
представление,
view
состоящее из последовательности, генерируемой повторным инкрементированием начального значения
(шаблон класса) (объект точки кастомизации) |
|
(C++23)
|
представление,
view
состоящее из кортежей ссылок на соответствующие элементы адаптированных представлений
(шаблон класса) (объект точки кастомизации) |
принимает
view
состоящий из
tuple-like
значений и число N, и создаёт
view
N-го элемента каждого кортежа
(шаблон класса) (объект адаптера диапазона) |