Spec-Zone.ru › C++

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

Определено в заголовке <ranges>
template< std::weakly_incrementable W,
          std::semiregular Bound = std::unreachable_sentinel_t >
    requires __WeaklyEqualityComparableWith<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)
Подпись вызова
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)
1) Фабрика диапазонов, генерирующая последовательность элементов путём многократного инкрементирования начального значения. Может быть ограниченной или неограниченной (бесконечной).
2) views::iota(e) и views::iota(e, f) эквивалентны выражениям iota_view(e) и iota_view(e, f) соответственно для любых подходящих подвыражений e и f.

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

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

Все экземпляры __iota_fn равны. Эффекты вызова различных экземпляров типа __iota_fn с одними и теми же аргументами эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и является ли он const-квалифицированным или нет (однако экземпляр с volatile-квалификацией не обязан быть вызываемым). Таким образом, views::iota может быть свободно скопирован, и его копии могут быть использованы взаимозаменяемо.

Учитывая набор типов Args..., если std::declval<Args>()... соответствуют требованиям аргументов для views::iota выше, __iota_fn моделирует

  • std::invocable<__iota_fn, Args...>,
  • std::invocable<const __iota_fn, Args...>,
  • std::invocable<__iota_fn&, Args...>, и
  • std::invocable<const __iota_fn&, Args...>.

В противном случае, ни один оператор вызова функции __iota_fn не участвует в разрешении перегрузки.

Члены данных

Имя члена Определение
value_ (private) Начальное значение типа W.
(объект только для целей иллюстрации*)
bound_ (private) Значение контрольной точки типа Bound.
(объект только для целей иллюстрации*)

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

(конструктор)
(C++20)
создаёт iota_view
(публичный член-функция)
begin
(C++20)
получает итератор начала iota_view
(публичный член-функция)
end
(C++20)
получает контрольную точку конца iota_view
(публичный член-функция)
empty
(C++20)
проверяет, пуст ли iota_view, т.е. итератор и контрольная точка сравниваются как равные
(публичный член-функция)
size
(C++20)
получает размер iota_view, если он определён
(публичный член-функция)
Унаследовано от std::ranges::view_interface
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>)

std::ranges::iota_view::iota_view

iota_view() requires std::default_initializable<W> = default;
(1) (since C++20)
constexpr explicit iota_view( W value );
(2) (since C++20)
constexpr explicit iota_view( std::type_identity_t<W> value,
                              std::type_identity_t<Bound> bound );
(3) (since C++20)
constexpr explicit iota_view( /* iterator */ first, /* see below */ last );
(4) (since C++20)
1) Инициализирует value_ и bound_ по умолчанию (через их инициализаторы по умолчанию = W() и = Bound()).
2) Инициализирует value_ значением value, а bound_ — значением по умолчанию. Этот конструктор используется для создания неограниченных iota_view (например, iota(0) генерирует числа 0, 1, 2 и т.д., бесконечно).
3) Инициализирует value_ значением value, и bound_ — значением bound. Поведение не определено, если std::totally_ordered_with<W, Bound> моделируется и bool(value <= bound) имеет значение false. Этот конструктор используется для создания ограниченных iota-представлений (например, iota(10, 20) генерирует числа от 10 до 19).
4) Аналогично (3), за исключением того, что value_ инициализируется значением W, хранящимся в first, и
  • если W и Bound имеют один и тот же тип, то тип last — /* iterator */, и bound_ инициализируется значением W, хранящимся в last,
  • в противном случае, если iota_view неограничен (то есть Bound — std::unreachable_sentinel_t), то тип last — std::unreachable_sentinel_t, и bound_ инициализируется значением std::unreachable_sentinel,
  • в противном случае, тип last — /* sentinel */, и bound_ инициализируется значением Bound, хранящимся в last.
Во всех случаях тип last совпадает с типом decltype(end()).

Для (2), (3) и (4) поведение не определено, если iota_view ограничен (т.е. Bound не равно std::unreachable_sentinel_t и bound_ инициализировано значением, недоступным из value_.

Параметры

value - начальное значение
bound - граница
first - итератор, обозначающий начальное значение
last - итератор или предел, обозначающий границу

std::ranges::iota_view::begin

constexpr /* iterator */ begin() const;
(since C++20)

Возвращает итератор, инициализированный value_.

std::ranges::iota_view::end

constexpr auto end() const;
(1) (since C++20)
constexpr /* iterator */ end() const requires std::same_as<W, Bound>;
(2) (since C++20)
1) Возвращает предел определенного типа (показан как /* sentinel */ здесь), инициализированный bound_, если данное представление ограничено, или std::unreachable_sentinel, если это представление неограничено.
2) Возвращает итератор, инициализированный bound_.

std::ranges::iota_view::empty

constexpr bool empty() const;
(since C++20)

Эквивалентно return value_ == bound_;.

std::ranges::iota_view::size

constexpr auto size() const
    requires (std::same_as<W, Bound> && /* advanceable */<W>)
        || (/* is-integer-like */<W> && /* is-integer-like */<Bound>)
        || std::sized_sentinel_for<Bound, W>
{
    if constexpr (/* is-integer-like */<W> && /* is-integer-like */<Bound>)
        return (value_ < 0)
            ? ((bound_ < 0)
                ? /* to-unsigned-like */(-value_)
                    - /* to-unsigned-like */(-bound_)
                : /* to-unsigned-like */(bound_)
                    + /* to-unsigned-like */(-value_))
            : /* to-unsigned-like */(bound_) - /* to-unsigned-like */(value_);
    else
        return /* to-unsigned-like */(bound_ - value_);
}
(since C++20)

Возвращает размер представления, если оно ограничено.

Концепция advanceable, представленная для пояснения, описывается на этой странице.

Шаблон функции to-unsigned-like, представленный для пояснения, преобразует свой аргумент (который должен быть целочисленного типа) в соответствующую беззнаковую версию типа аргумента.

Правила вывода типов

template< class W, class Bound >
    requires (!/* is-integer-like */<W>
        || !/* is-integer-like */<Bound>
        || /* is-signed-integer-like */<W>
            == /* is-signed-integer-like */<Bound>)
  iota_view( W, Bound ) -> iota_view<W, Bound>;
(since C++20)

Для любого типа T, /* is-integer-like */<T> — true тогда и только тогда, когда T является целочисленного типа, а /* is-signed-integer-like */<T> — true тогда и только тогда, когда T является целочисленного типа и может представлять отрицательные значения.

Обратите внимание, что данное правило защиты от ошибок несоответствия знакового и беззнакового типов, таких как views::iota(0, v.size()), где ​0​ — (знаковый) int, а v.size() — (беззнаковый) std::size_t.

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

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

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

template< std::weakly_incrementable W, std::semiregular Bound >
inline constexpr bool enable_borrowed_range<ranges::iota_view<W, Bound>> = true;
(since C++20)

Это специализация std::ranges::enable_borrowed_range, которая позволяет iota_view удовлетворять borrowed_range.

Пример

#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';
}

Вывод:

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 Применён к Поведение, как опубликовано Корректное поведение
LWG 3523 C++20 Конструктор пары итератор-предел может использовать неправильный тип предела исправлено
LWG 3610 C++20 size может отклонять типы целых чисел принимать, если возможно
LWG 4001 C++20 наследованная функция-член empty не всегда была корректной empty всегда доступна
P2325R3 C++20 iota_view потребовало, чтобы W было semiregular
так как view потребовало default_initializable
требуется только, чтобы W было copyable
P2711R1 C++20 многопараметровые конструкторы не были явными сделаны явными

См. также

iota
(C++11)
заполняет диапазон последовательными приращениями начального значения
(шаблон функции)
ranges::iota
(C++23)
заполняет диапазон последовательными приращениями начального значения
(niebloid)
ranges::repeat_viewviews::repeat
(C++23)
a view состоящий из сгенерированной последовательности, получаемой путем многократного воспроизведения одного и того же значения
(шаблон класса) (объект кастомизации)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/iota_view

Spec-Zone.ru

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