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 函数对象。为阐述目的,以 __iota_fn
表示它的类型的 cv 无限定版本。
__iota_fn
的所有实例均相等。在相同实参上调用 __iota_fn
类型的不同实例的效果是等价的,这与指代该实例的表达式是左值还是右值,以及是否为 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
的函数调用运算符不会参与重载决议。
数据成员
成员 | 定义 |
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) |
用从起始值开始连续递增的值填充一个范围 (niebloid) |
由重复产出同一值生成的序列组成的 view (类模板) (定制点对象) |