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, /* see below */ last ) ;
(4) (C++20 起)

构造一个 iota_view

重载 数据成员
value_ bound_
(1) 值初始化 值初始化
(2) 使用 value 初始化
(3) 使用 bound 初始化
(4) 使用 first. value_ 初始化 见下文
2,3) 若满足以下任一条件,则行为未定义:
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++ 标准。

缺陷报告 应用于 发布时的行为 正确行为
LWG 3523 C++20 重载 (4) 可能使用了错误的哨兵类型 已修正
P2711R1 C++20 重载 (3,4) 不是显式的 改为显式