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) | (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) | (только для пояснения*) |
enumerate_viewпредставляет собой адаптер диапазона, который принимает view и создаёт представление из std::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
(публичная функция-член) |
Унаследовано от 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
>>
=
|
(начиная с 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-го элемента каждого кортежа
(шаблон класса) (объект адаптера диапазона) |