iota_view
类(C++ 标准库)
通过重复递增初始值来生成元素序列的视图。 序列可以绑定或未绑定。
语法
template<std::weakly_incrementable W, std::semiregular Bound = std::unreachable_sentinel_t>
requires __WeaklyEqualityComparableWith<W, Bound> && std::copyable<W>
class iota_view : public ranges::view_interface<iota_view<W, Bound>>;
模板参数
W
序列中值的类型。 指定的类型必须支持 operator++
。
Bound
结束值的类型。 如果 Bound
为 std::unreachable_sentinel_t
(默认值),则视图未绑定。
视图特征
有关下列条目的说明,请参阅视图类特征
特征 | 说明 |
---|---|
范围适配器 | views::iota |
基础范围 | 不适用,因为此视图生成其成员 |
元素类型 | 与模板参数 W 相同 |
视图枚举器类别 | 支持最多 random_access_range 的 input_range ,具体取决于 W 的类型 |
已设置大小 | 仅当范围具有结束值时,即它不是无限序列时 |
是 const 可迭代 |
是 |
常见范围 | 仅当 Bound 与 W 的类型相同 |
借入范围 | 是 |
成员
成员函数 | 描述 |
---|---|
构造函数C++20 | 构造视图。 |
begin C++20 |
获取指向第一个元素的迭代器。 |
end C++20 |
获取视图末尾的 sentinel。 |
size C++20 |
获取元素数。 |
从 view_interface 继承 |
描述 |
back C++20 |
获取最后一个元素。 |
empty C++20 |
测试视图是否为空。 |
front C++20 |
获取第一个元素。 |
operator[] C++20 |
获取指定位置的元素。 |
operator bool C++20 |
测试视图是否不为空。 |
注解
创建 iota_view
的好方法是使用 iota
范围适配器。 范围适配器是创建视图类的预期方法。 如果要创建自己的自定义视图类型,会公开视图类型。
值序列可以是范围中的 1、2、3 或 'a'、'b'、'c' 或连续元素等整数值。
此视图常用于循环访问一系列值。 例如:
for (int i : iota_view{1, 10}) // iterate over a view of the integers 1 through 9
{
std::cout << i << ’ ’; // 1 2 3 4 5 6 7 8 9
}
要求
标头: <ranges>
(自C++20以来)
命名空间:std::ranges
编译器选项:/std:c++20
或更高版本是必需的。
构造函数
创建 iota_view
的实例。
1) iota_view() requires std::default_initializable<W> = default;
2) constexpr explicit iota_view(W value);
3) constexpr iota_view(std::type_identity_t<W> value, std::type_identity_t<Bound> bound);
4) constexpr iota_view( /*iterator*/ first, /*sentinel*/ last );
参数
value
序列的起始值。
bound
序列的边界。 它大于序列中最后一个值。
有关模板参数类型的信息,请参阅模板参数。
备注
1) 创建一个 iota_view
,其起始值和结束值由默认初始化的模板类型 W
确定。
2) 使用指定的起始值和结束值创建一个 iota_view
,该值由值初始化的类型 W
确定。
3) 创建具有指定起始值和结束值的边界 iota_view
。 结束值比指定的最后一个值小 1。
4) 用于创建子视图。 例如 std::ranges::iota_view(start, end);
,其中 start
和 end
是子视图开始和结尾的迭代器。
创建 iota_view
的简单方法是使用 iota
范围适配器,而不是直接创建此类。 范围适配器是创建视图类的预期方法。 如果要创建自己的自定义视图类型,会公开视图类型。
如果绑定的类型为 unreachable_sentinel_t
,则生成的视图是绑定的。
使用值初始化绑定的构造函数之一时,绑定将是该类型的默认初始化值。 例如,iota_view<int, int>{}
是 int
的空范围,因为默认构造的 int 值和绑定都是 0
。 此外,iota_view<int, int>{-4}
是 -4, -3, -2, -1
,因为默认构造的 int
绑定是 0
。
iota_view
构造函数示例
// requires /std:c++20, or later
#include <ranges>
#include <iostream>
#include <vector>
int main()
{
std::ranges::iota_view<int> iv; // create an iota_view with an unbounded range, starting at 0
std::ranges::iota_view<int> iv2(5); // create an iota_view with an unbounded range, starting at 5.
std::ranges::iota_view<int, int> iv3{5, 10}; // create an iota_view with a bounded range, starting at 5 and ending at 9
std::vector<int> v{10, 20, 35, 45, 50, 66, 77, 82, 90, 100};
auto start = std::ranges::find(v, 35);
auto end = std::ranges::find(v, 82);
for (auto &&val : std::ranges::iota_view(start, end))
{
std::cout << *val << ' '; // outputs 35 45 50 66 77
}
}
begin
获取指向视图中第一个元素的迭代器。
constexpr auto begin();
constexpr auto begin() const requires range<const V>;
参数
无。
返回值
指向视图中第一个元素的迭代器。
end
获取视图末尾的 end sentinel。
constexpr auto end();
constexpr auto end() const requires ranges::range<const V>;
参数
无。
返回值
如果 iota_view
未绑定,则返回 std::unreachable_sentinel
。
如果 iota_view
已绑定,则返回指向序列中最后一个值后面的 sentinel 的迭代器。
size
获取视图中的元素数。 iota_view
必须绑定。
constexpr auto size() requires
(same_as<W, Bound> && advanceable <W>) ||
(integral<W> && integral<Bound>) ||
sized_sentinel_for<Bound, W>;
参数
无。
返回值
iota_view
中的元素的数量。
备注
你不能调用未绑定的 iota_view
上的 size()
。