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) | (только для экспозиции*) |
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 (открытая функция-член) |
|
| возвращает копию базового (адаптированного) представления (открытая функция-член) |
|
| возвращает итератор на начало (открытая функция-член) |
|
| возвращает итератор или sentinel на конец (открытая функция-член) |
|
возвращает количество элементов; доступен только если базовый (адаптированный) диапазон удовлетворяет концепции sized_range (открытая функция-член) |
|
|
(C++26) | возвращает приблизительный размер результирующего approximately_sized_range (открытая функция-член) |
Унаследовано от |
|
возвращает значение, указывающее, является ли производное представление пустым; доступен только если оно удовлетворяет 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) | тип 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]
См. также
|
(C++20) | view, состоящее из последовательности, полученной многократным увеличением начального значения(шаблон класса) (объект-точка настройки) |
|
(C++26) | view, генерирующее последовательность возрастающих значений от 0 до n(объект-точка настройки) |
|
(C++23) | view, состоящее из кортежей ссылок на соответствующие элементы адаптированных представлений(шаблон класса) (объект-точка настройки) |
|
(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