std::ranges::views::iota, std::ranges::iota_view
来自cppreference.com
在标头 <ranges> 定义 | ||
template< std::weakly_incrementable W, std::semiregular Bound = std::unreachable_sentinel_t > | (1) | (C++20 起) |
namespace views { inline constexpr /* 未指定 */ iota = /* 未指定 */; | (2) | (C++20 起) |
调用签名 | ||
template< class W > requires /* 见下文 */ | (C++20 起) | |
template< class W, class Bound > requires /* 见下文 */ | (C++20 起) | |
1) 以重复自增初值生成序列的范围工厂。可以有界或无界(无限)。
2)views::iota(e) 与 views::iota(e, f) 对于适合的子表达式 e 和 f 分别表达式等价于 iota_view<std::decay_t<decltype((e))>>(e) 与 iota_view(e, f)。
定制点对象
名字 views::iota
代表一个定制点对象,它是某个字面 semiregular
类类型的 const 函数对象。 细节参见定制点对象 (CustomizationPointObject) 。
数据成员
成员 | 定义 |
W value_ | 起始值 (仅用于阐述的成员对象*) |
Bound bound_ | 哨位值,不一定可及 (仅用于阐述的成员对象*) |
成员函数
创建 iota_view (公开成员函数) | |
获得 iota_view 的起始迭代器 (公开成员函数) | |
获得代表 iota_view 末尾的哨位 (公开成员函数) | |
测试 iota_view 是否为空(即迭代器与哨位是否比较相等) (公开成员函数) | |
(可选) | 在 iota_view 具有大小时获得它的大小(有界时提供) (公开成员函数) |
继承自 std::ranges::view_interface | |
(C++23) | 返回指向范围起始的常量迭代器 ( std::ranges::view_interface<D> 的公开成员函数) |
(C++23) | 返回对应于范围常量迭代器的哨位 ( std::ranges::view_interface<D> 的公开成员函数) |
返回派生视图是否为非空,仅当 ranges::empty 可应用于它时提供 ( std::ranges::view_interface<D> 的公开成员函数) | |
返回派生视图中的首元素,仅当视图满足 forward_range 时提供 ( std::ranges::view_interface<D> 的公开成员函数) | |
返回派生视图中的末元素,仅当视图满足 bidirectional_range 与 common_range 时提供 ( std::ranges::view_interface<D> 的公开成员函数) | |
返回派生视图中的第 n 个元素,仅当视图满足 random_access_range 时提供 ( 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
。
示例
运行此代码
#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++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 4096 | C++20 | views::iota 能照原样复制 iota_view | 已禁止 |
P2325R3 | C++20 | iota_view 要求 W 是 semiregular 因为 view 要求 default_initializable | 仅要求 W 是 copyable |
参阅
(C++11) | 从初始值开始连续递增填充范围 (函数模板) |
(C++23) | 从初始值开始连续递增填充范围 (算法函数对象) |
由重复产出同一值生成的序列组成的 view (类模板) (定制点对象) | |
将被适配视图的各元素映射为元素位置和其值组成的元组的 view (类模板) (范围适配器对象) |