Spec-Zone.ru › C++

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) (только для иллюстрации*)
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 моделирует соответствующие концепции.

Члены данных

Название члена Определение
base_ (private) Итератор на базовый последовательность типа V.
(член объекта только для иллюстрации*)

Члены-функции

(конструктор)
(C++23)
создаёт enumerate_view
(публичный член-функция)
base
(C++23)
возвращает копию базового (адаптированного) представления
(публичный член-функция)
begin
(C++23)
возвращает итератор в начало
(публичный член-функция)
end
(C++23)
возвращает итератор или страж до конца
(публичный член-функция)
size
(C++23)
возвращает количество элементов. Предоставляется только если базовый (адаптированный) диапазон удовлетворяет sized_range.
(публичный член-функция)
Унаследовано от std::ranges::view_interface
empty
(C++20)
возвращает, пусто ли производное представление. Предоставляется, если оно удовлетворяет sized_range или forward_range.
(публичный член-функция std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает постоянный итератор в начало диапазона.
(публичный член-функция std::ranges::view_interface<D>)
cend
(C++23)
возвращает страж для постоянного итератора диапазона.
(публичный член-функция std::ranges::view_interface<D>)
operator bool
(C++20)
возвращает, не пусто ли производное представление. Предоставляется, если ranges::empty применимо к нему.
(публичный член-функция std::ranges::view_interface<D>)
front
(C++20)
возвращает первый элемент в производном представлении. Предоставляется, если оно удовлетворяет forward_range.
(публичный член-функция std::ranges::view_interface<D>)
back
(C++20)
возвращает последний элемент в производном представлении. Предоставляется, если оно удовлетворяет bidirectional_range и common_range.
(публичный член-функция std::ranges::view_interface<D>)
operator[]
(C++20)
возвращает n-й элемент в производном представлении. Предоставляется, если оно удовлетворяет random_access_range.
(публичный член-функция std::ranges::view_interface<D>)

Рекомендации по выводу типов

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

iterator
(C++23)
тип итератора
(вложенный шаблон класса только для иллюстрации*)
sentinel
(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]

См. также

ranges::iota_viewviews::iota
(C++20)
представление, содержащее последовательность, генерируемую последовательным увеличением начального значения
(шаблон класса) (объект точек кастомизации)
ranges::zip_viewviews::zip
(C++23)
представление, содержащее кортежи ссылок на соответствующие элементы адаптированных представлений
(шаблон класса) (объект точек кастомизации)
ranges::elements_viewviews::elements
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API