Namespaces
Variants

std::ranges::iota_view<W, Bound>:: iota_view

From cppreference.net
Ranges library
Range adaptors
iota_view ( ) requires std:: default_initializable < W > = default ;
(1) (начиная с C++20)
constexpr explicit iota_view ( W value ) ;
(2) (начиная с C++20)
constexpr explicit iota_view ( std:: type_identity_t < W > value,
std:: type_identity_t < Bound > bound ) ;
(3) (начиная с C++20)
constexpr explicit iota_view ( /*iterator*/ first, /* см. ниже */ last ) ;
(4) (начиная с C++20)

Создаёт iota_view .

Перегрузка Члены данных
value_ bound_
(1) инициализировано значением по умолчанию инициализировано значением по умолчанию
(2) инициализировано с value
(3) инициализировано с bound
(4) инициализировано с first. value_ см. ниже
2,3) Если выполняется любое из следующих условий, поведение не определено:
  • Bound ( ) недостижим из value , за исключением случая, когда Bound обозначает std::unreachable_sentinel_t .
  • W и Bound моделируют totally_ordered_with , и bool ( value <= bound ) равно false .
4) Если выполняется любое из следующих условий, поведение не определено:
Тип last и метод инициализации bound_ определяются типом, который обозначает Bound :
Тип, обозначаемый Bound Тип last bound_
W iterator инициализируется с last. value_
std::unreachable_sentinel_t Bound инициализируется с last
любой другой тип sentinel инициализируется с last. bound_

Параметры

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

Пример

#include <cassert>
#include <iostream>
#include <iterator>
#include <ranges>
int main()
{
    const auto l = {1, 2, 3, 4};
    auto i1 = std::ranges::iota_view<int, int>(); // перегрузка (1)
    assert(i1.empty() and i1.size() == 0);
    auto i2 = std::ranges::iota_view(1); // перегрузка (2)
    assert(not i2.empty() and i2.front() == 1);
    for (std::cout << "1) "; auto e : i2 | std::views::take(3))
        std::cout << e << ' ';
    std::cout << '\n';
    auto i3 = std::ranges::iota_view(std::begin(l)); // перегрузка (2)
    assert(not i3.empty() and i3.front() == l.begin());
    for (std::cout << "2) "; auto e : i3 | std::views::take(4))
        std::cout << *e << ' ';
    std::cout << '\n';
    auto i4 = std::ranges::iota_view(1, 8); // перегрузка (3)
    assert(not i4.empty() and i4.front() == 1 and i4.back() == 7);
    for (std::cout << "3) "; auto e : i4)
        std::cout << e << ' ';
    std::cout << '\n';
    auto i5 = std::ranges::iota_view(l.begin(), l.end()); // перегрузка (4)
    for (std::cout << "4) "; auto e : i5)
        std::cout << *e << ' ';
    std::cout << '\n';
    auto i6 = std::ranges::iota_view(l.begin(), std::unreachable_sentinel); // (4)
    for (std::cout << "5) "; auto e : i6 | std::views::take(3))
        std::cout << *e << ' ';
    std::cout << '\n';
}

Вывод:

1) 1 2 3
2) 1 2 3 4
3) 1 2 3 4 5 6 7
4) 1 2 3 4
5) 1 2 3

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

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

DR Applied to Behavior as published Correct behavior
LWG 3523 C++20 overload (4) might use wrong sentinel type corrected
P2711R1 C++20 overloads (3,4) were not explicit made explicit