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 обозначает 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 моделирует соответствующие концепции.
Члены данных
| Название члена | Определение |
|---|---|
base_ (private) | Итератор на базовый последовательность типа V.(член объекта только для иллюстрации*) |
Члены-функции
|
(C++23) | создаёт enumerate_view (публичный член-функция) |
|
(C++23) | возвращает копию базового (адаптированного) представления (публичный член-функция) |
|
(C++23) | возвращает итератор в начало (публичный член-функция) |
|
(C++23) | возвращает итератор или страж до конца (публичный член-функция) |
|
(C++23) | возвращает количество элементов. Предоставляется только если базовый (адаптированный) диапазон удовлетворяет sized_range. (публичный член-функция) |
Унаследовано от |
|
|
(C++20) | возвращает, пусто ли производное представление. Предоставляется, если оно удовлетворяет sized_range или forward_range. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++23) | возвращает постоянный итератор в начало диапазона. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++23) | возвращает страж для постоянного итератора диапазона. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает, не пусто ли производное представление. Предоставляется, если ranges::empty применимо к нему. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает первый элемент в производном представлении. Предоставляется, если оно удовлетворяет forward_range. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает последний элемент в производном представлении. Предоставляется, если оно удовлетворяет bidirectional_range и common_range. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает 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>> =
std::ranges::enable_borrowed_range<View>;
| (с C++23) |
Это специализация std::ranges::enable_borrowed_range, которая делает enumerate_view удовлетворяющим borrowed_range, когда базовая view удовлетворяет ему.
Примечания
| Тест на наличие функции макрос | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_ranges_enumerate | 202302L | (C++23) |
std::ranges::enumerate_view |
Пример
#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:2023):
- 26.7.23 Представление перечисления [range.enumerate]
См. также
|
(C++20) | представление, содержащее последовательность, генерируемую последовательным увеличением начального значения (шаблон класса) (объект точек кастомизации) |
|
(C++23) | представление, содержащее кортежи ссылок на соответствующие элементы адаптированных представлений (шаблон класса) (объект точек кастомизации) |
|
(C++20) | принимает представление, содержащее значения типа tuple-like, и число N, и создаёт представление N-го элемента каждого кортежа(шаблон класса) (объект адаптера диапазонов) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/enumerate_view