Namespaces
Variants

std::ranges::views::iota, std::ranges::iota_view, std::ranges::views::indices

С сайта ru.cppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 
 
Определён в заголовке <ranges>
template< std::weakly_incrementable W,
          std::semiregular Bound = std::unreachable_sentinel_t >
    requires /*weakly-equality-comparable-with*/<W, Bound> && std::copyable<W>
class iota_view
    : public ranges::view_interface<iota_view<W, Bound>>
(1) (начиная с C++20)
namespace views {
    inline constexpr /* unspecified */ iota = /* unspecified */;
}
(2) (начиная с C++20)
namespace views {
    inline constexpr /* unspecified */ indices = /* unspecified */;
}
(3) (начиная с C++26)
Сигнатура вызова
template< class W >
    requires /* see below */
constexpr /* see below */ iota( W&& value );
(начиная с C++20)
template< class W, class Bound >
    requires /* see below */
constexpr /* see below */ iota( W&& value, Bound&& bound );
(начиная с C++20)
template< class T >
    requires /*is-integer-like*/<T>
constexpr /* see below */ indices( T bound );
(начиная с C++26)
1) Фабрика диапазонов, которая генерирует последовательность элементов путём многократного увеличения начального значения. Может быть как ограниченной, так и неограниченной (бесконечной).
2) views::iota(e) и views::iota(e, f) являются эквивалентными по выражению для iota_view<std::decay_t<decltype((e))>>(e) и iota_view(e, f) соответственно для любых подходящих подвыражений e и f.
3) Пусть T будет std::remove_cvref_t<decltype((e))>. Тогда views::indices(e) является эквивалентным по выражению для views::iota(T(0), e) для любого подходящего подвыражения e, если /*is-integer-like*/<T> является true.

Объекты точек кастомизации

Имя views::iota обозначает объект точки кастомизации , который является константным функциональным объектом типа литерального semiregular класса. Для подробностей см. CustomizationPointObject .

Элементы данных

Элемент Описание
W value_ начальное значение
(объект-элемент, только для пояснения*)
Bound bound_ сторожевое значение, может быть недостижимым
(объект-элемент, только для пояснения*)

Функции-члены

создает iota_view
(публичная функция-член)
получает начальный итератор iota_view
(публичная функция-член)
получает страж, обозначающий конец iota_view
(публичная функция-член)
проверяет, является ли iota_view пустым (т.е. итератор и страж равны)
(публичная функция-член)
(optional)
получает размер iota_view (предоставляется только если он ограничен)
(публичная функция-член)
Унаследовано от ranges::view_interface
(C++23)
возвращает константный итератор на начало диапазона
(public функция-элемент std::ranges::view_interface<D>)
(C++23)
возвращает ограничитель для константного итератора диапазона
(public функция-элемент std::ranges::view_interface<D>)
возвращает, является ли производное представление непустым, только если к нему применимо ranges::empty
(public функция-элемент std::ranges::view_interface<D>)
возвращает первый элемент в производном представлении, если оно удовлетворяет forward_range
(public функция-элемент std::ranges::view_interface<D>)
возвращает последний элемент в производном представлении, только если оно удовлетворяет bidirectional_range и common_range
(public функция-элемент std::ranges::view_interface<D>)
возвращает n-й элемент в производном представлении, только если оно удовлетворяет random_access_range
(public функция-элемент std::ranges::view_interface<D>)

Руководства по выводу

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

тип итератора
( класс-член только для демонстрации* )
тип сторожа, используемый когда iota_view является ограниченным и Bound и W не являются одним и тем же типом
( класс-член только для демонстрации* )

Вспомогательные шаблоны

template < std:: weakly_incrementable W, std:: semiregular Bound >
constexpr bool ranges:: enable_borrowed_range < ranges :: iota_view < W, Bound >> = true ;
(начиная с C++20)

Эта специализация ranges:: enable_borrowed_range позволяет iota_view удовлетворять требованиям borrowed_range .

Возможная реализация

См. также реализацию в libstdc++.

views::indices (3)
namespace views {
    inline constexpr auto indices = []</*is-integer-like*/ I>(I n)
    {
        return views::iota(I{}, n);
    };
}

Примечания

Макрос проверки возможностей Значение Стандарт Возможность
__cpp_lib_ranges_indices 202506L (C++26) ranges::views::indices

Пример

#include <algorithm>
#include <iostream>
#include <ranges>
    
struct Bound
{
    int bound;
    bool operator==(int x) const { return x == bound; }
};

int main()
{
    for (int i : std::ranges::iota_view{1, 10})
        std::cout << i << ' ';
    std::cout << '\n';
    
    for (int i : std::views::iota(1, 10))
        std::cout << i << ' ';
    std::cout << '\n';
    
    for (int i : std::views::iota(1, Bound{10}))
        std::cout << i << ' ';
    std::cout << '\n';
    
    for (int i : std::views::iota(1) | std::views::take(9))
        std::cout << i << ' ';
    std::cout << '\n';
    
    std::ranges::for_each(std::views::iota(1, 10),
                          [](int i){ std::cout << i << ' '; });
    std::cout << '\n';

#if __cpp_lib_ranges_indices
    constexpr int v[]{1, 2, 3, 4, 5, 6, 7, 8, 9};

    // auto broken_indices = views::iota(0, std::ranges::size(v));
    //     does not compile due to types (int VS size_t) mismatch

    auto good_indices = std::views::indices(std::ranges::size(v));

    for (auto i : good_indices)
        std::cout << v[i] << ' ';
    std::cout << '\n';
#endif
}

Вывод:

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

Отчеты о дефектах

Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 4096 C++20 views::iota could copy an iota_view as-is forbidden
P2325R3 C++20 iota_view required that W is semiregular
as view required default_initializable
only requires that W is copyable

Ссылки

  • Стандарт C++26 (ISO/IEC 14882:2026):
  • 25.6.4 Вид Iota [range.iota]
  • Стандарт C++23 (ISO/IEC 14882:2024):
  • 26.6.4 Вид Iota [range.iota]
  • Стандарт C++20 (ISO/IEC 14882:2020):
  • 24.6.4 Вид Iota [range.iota]

См. также

(C++11)
заполняет диапазон последовательно возрастающими значениями, начиная с заданного
(шаблон функции & функциональный объект алгоритма)
заполняет диапазон последовательно возрастающими значениями, начиная с заданного
(функциональный объект алгоритма)
представление, состоящее из сгенерированной путём многократного повторения одного и того же значения последовательности
(шаблон класса) (объект точки настройки)
представление, которое отображает каждый элемент адаптированной последовательности в кортеж, содержащий как позицию элемента, так и его значение
(шаблон класса) (объект адаптера диапазона)