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) |
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 (публичный член-функция) |
|
(C++20) | получает итератор начала iota_view (публичный член-функция) |
|
(C++20) | получает контрольную точку конца iota_view (публичный член-функция) |
|
(C++20) | проверяет, пуст ли iota_view, т.е. итератор и контрольная точка сравниваются как равные (публичный член-функция) |
|
(C++20) | получает размер iota_view, если он определён (публичный член-функция) |
Унаследовано от |
|
|
(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>) |
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) |
value_ и bound_ по умолчанию (через их инициализаторы по умолчанию = W() и = Bound()).value_ значением value, а bound_ — значением по умолчанию. Этот конструктор используется для создания неограниченных iota_view (например, iota(0) генерирует числа 0, 1, 2 и т.д., бесконечно).value_ значением value, и bound_ — значением bound. Поведение не определено, если std::totally_ordered_with<W, Bound> моделируется и bool(value <= bound) имеет значение false. Этот конструктор используется для создания ограниченных iota-представлений (например, iota(10, 20) генерирует числа от 10 до 19).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) |
/* sentinel */ здесь), инициализированный bound_, если данное представление ограничено, или std::unreachable_sentinel, если это представление неограничено.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 | многопараметровые конструкторы не были явными | сделаны явными |
См. также
|
(C++11) | заполняет диапазон последовательными приращениями начального значения (шаблон функции) |
|
(C++23) | заполняет диапазон последовательными приращениями начального значения (niebloid) |
|
(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