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) 分别与 iota_view<std::decay_t<decltype((e))>>(e) 和 iota_view(e, f) 表达式等效,适用于任何合适的子表达式 e 和 f。
内容 |
定制点对象
名称 views::iota
表示一个定制点对象,它是一个 const 函数对象,属于一个 字面量 semiregular
类类型。为了解释的目的,其类型的 cv 无限定版本表示为 __iota_fn
。
所有 __iota_fn
的实例都是相等的。无论表示实例的表达式是左值还是右值,以及是否为 const 限定,调用类型 __iota_fn
的不同实例对相同参数的效果都是等效的(但是,不需要调用易变限定的实例)。因此,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
的任何函数调用运算符都不会参与重载解析。
[edit] 数据成员
成员 | 定义 |
W value_ |
起始值 (仅供说明的成员对象*) |
Bound bound_ |
哨兵值,可能不可达 (仅供说明的成员对象*) |
[edit] 成员函数
创建一个 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> 的公有成员函数) |
[edit] 推导指南
[edit] 嵌套类
迭代器类型 (仅供说明的成员类*) | |
当 iota_view 有界且 Bound 和 W 不是同一类型时使用的哨兵类型(仅供说明的成员类*) |
[edit] 辅助模板
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
。
[edit] 示例
运行此代码
#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
[edit] 缺陷报告
以下更改行为的缺陷报告被追溯应用于以前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 4096 | C++20 | views::iota 可以按原样复制 iota_view |
禁止 |
P2325R3 | C++20 | iota_view 要求 W 是 semiregular 因为 view 要求 default_initializable |
仅要求 W 是 copyable |
[edit] 另请参阅
(C++11) |
用起始值的连续增量填充范围 (函数模板) |
(C++23) |
用起始值的连续增量填充范围 (niebloid) |
一个 view ,由重复生成相同值的生成序列组成(类模板) (自定义点对象) |