std::ranges::iota_view<W, Bound>::迭代器
struct /*iterator*/; |
(1) | (仅作说明*) |
| 辅助别名模板 |
||
template< class I > using /*iota-diff-t*/ = /* 见下文 */; |
(2) | (仅作说明*) |
| 辅助概念 |
||
template< class I > 概念 /*decrementable*/ = |
(3) | (仅作说明*) |
template< class I > 概念 /*advanceable*/ = |
(4) | (仅作说明*) |
- 如果
I不是整数类型,或者它是一个整数类型且 sizeof(std::iter_difference_t<I>) 大于 sizeof(I),则 /*iota-diff-t*/<I> 是 std::iter_difference_t<I>。 - 否则,如果存在宽度大于
I的带符号整数类型,则 /*iota-diff-t*/<I> 是该类型。 - 否则,
I是最宽的整数类型之一,且 /*iota-diff-t*/<I> 是一个未指定的 带符号整数类类型,其宽度不小于I的宽度。在这种情况下,/*iota-diff-t*/<I> 是否是weakly_incrementable的模型是未指定的。
decrementable 又是 totally_ordered,并且该类型与其差值类型之间的 operator+=、operator-=、operator+ 和 operator- 具有共同的含义。/*iterator*/ 模型
-
random_access_iterator,如果 W 模型advanceable(4), -
bidirectional_iterator,如果 W 模型decrementable(3), -
forward_iterator,如果 W 模型incrementable,并且 -
input_iterator,否则。
然而,它仅在 W 模型 incrementable 时才满足 LegacyInputIterator,否则不满足 LegacyInputIterator。
[编辑] 语义要求
I 仅当 I 满足 decrementable 且其包含的所有概念都得到模型化时才模型 decrementable,并且给定类型 I 的相等对象 a 和 b- 如果 a 和 b 都在前置和后置 operator-- 的域中(即它们是可递减的),则以下所有条件都为 true
- std::addressof(--a) == std::addressof(a),
- bool(a-- == b),
- bool(((void)a--, a) == --b),
- bool(++(--a) == b).
- 如果 a 和 b 都在前置和后置 operator++ 的域中(即它们是可递增的),则 bool(--(++a) == b) 为 true。
D 表示 /*iota-diff-t*/<I>。类型 I 仅当 I 满足 advanceable 且其包含的所有概念都得到模型化时才模型 advanceable,并且给定- 类型
I的对象 a 和 b,以及 - 类型
D的值 n,
使得 n 次应用 ++a 后,b 可从 a 访问,以下所有条件均满足
- (a += n) 等于 b。
- std::addressof(a += n) 等于 std::addressof(a)。
- I(a + n) 等于 (a += n)。
- 对于类型
D的任意两个正值 x 和 y,如果 I(a + D(x + y)) 是定义良好的,则 I(a + D(x + y)) 等于 I(I(a + x) + y)。 - I(a + D(0)) 等于 a。
- 如果 I(a + D(n - 1)) 是定义良好的,则 I(a + n) 等于 [](I c) { return ++c; }(I(a + D(n - 1)))。
- (b += -n) 等于 a。
- (b -= n) 等于 a。
- std::addressof(b -= n) 等于 std::addressof(b)。
- I(b - n) 等于 (b -= n)。
- D(b - a) 等于 n。
- D(a - b) 等于 D(-n)。
- bool(a <= b) 为 true。
[编辑] 嵌套类型
| 类型 | 定义 |
iterator_concept
|
一个 迭代器标签,见下文 |
iterator_category(仅当 W 模型 incrementable 且/*iota-diff-t*/<W> 是整数类型时才存在) |
std::input_iterator_tag |
value_type
|
W
|
difference_type
|
/*iota-diff-t*/<W> |
[编辑] 确定迭代器概念
iterator_concept 定义如下:
- 如果
W模型advanceable,则iterator_concept表示 std::random_access_iterator_tag。 - 否则,如果
W模型decrementable,则iterator_concept表示 std::bidirectional_iterator_tag。 - 否则,如果
W模型incrementable,则iterator_concept表示 std::forward_iterator_tag。 - 否则,
iterator_concept表示 std::input_iterator_tag。
[编辑] 数据成员
| 成员 | 定义 |
W value_ |
当前值 (仅用于阐释的成员对象*) |
[编辑] 成员函数
std::ranges::iota_view::iterator::iterator
| /*iterator*/() requires std::default_initializable<W> = default; |
(1) | (C++20 起) |
| constexpr explicit /*iterator*/( W value ); |
(2) | (C++20 起) |
value_。std::ranges::iota_view::iterator::operator*
| constexpr W operator*() const noexcept(std::is_nothrow_copy_constructible_v<W>); |
(C++20 起) | |
返回 value_。
示例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(6, 9).begin()}; const int& r = *it; // binds with temporary assert(*it == 6 and r == 6); ++it; assert(*it == 7 and r == 6); }
std::ranges::iota_view::iterator::operator++
| constexpr /*迭代器*/& operator++(); |
(1) | (C++20 起) |
| constexpr void operator++(int); |
(2) | (C++20 起) |
| constexpr /*iterator*/ operator++(int) requires std::incrementable<W>; |
(3) | (C++20 起) |
value_ ; return *this;。value_ ;。value_ ; return tmp;。示例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(8).begin()}; assert(*it == 8); assert(*++it == 9); assert(*it++ == 9); assert(*it == 10); }
std::ranges::iota_view::iterator::operator--
| constexpr /*iterator*/& operator--() requires /*decrementable*/<W>; |
(1) | (C++20 起) |
| constexpr /*iterator*/operator--(int) requires /*decrementable*/<W>; |
(2) | (C++20 起) |
value_ ; return *this;。value_ ; return tmp;。示例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(8).begin()}; assert(*it == 8); assert(*--it == 7); assert(*it-- == 7); assert(*it == 6); }
std::ranges::iota_view::iterator::operator+=
| constexpr /*iterator*/& operator+=( difference_type n ) requires /*advanceable*/<W>; |
(C++20 起) | |
更新 value_ 并返回 *this
示例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(5).begin()}; assert(*it == 5); assert(*(it += 3) == 8); }
std::ranges::iota_view::iterator::operator-=
| constexpr /*iterator*/& operator-=( difference_type n ) requires /*advanceable*/<W>; |
(C++20 起) | |
更新 value_ 并返回 *this
示例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(6).begin()}; assert(*it == 6); assert(*(it -= -3) == 9); }
std::ranges::iota_view::iterator::operator[]
| constexpr W operator[]( difference_type n ) const requires /*advanceable*/<W>; |
(C++20 起) | |
返回 W(value_ + n)。
示例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(6).begin()}; assert(*it == 6); assert(*(it + 3) == 9); }
[编辑] 非成员函数
operator==, <, >, <=, >=, <=>(std::ranges::iota_view::iterator)
| friend constexpr bool operator== ( const /*iterator*/& x, const /*iterator*/& y ) |
(1) | (C++20 起) |
| friend constexpr bool operator< ( const /*iterator*/& x, const /*iterator*/& y ) |
(2) | (C++20 起) |
| friend constexpr bool operator> ( const /*iterator*/& x, const /*iterator*/& y ) |
(3) | (C++20 起) |
| friend constexpr bool operator<= ( const /*iterator*/& x, const /*iterator*/& y ) |
(4) | (C++20 起) |
| friend constexpr bool operator>= ( const /*iterator*/& x, const /*iterator*/& y ) |
(5) | (C++20 起) |
| friend constexpr bool operator<=> ( const /*iterator*/& x, const /*iterator*/& y ) |
(6) | (C++20 起) |
!= 运算符由 operator== 合成。
这些函数在普通的 非限定查找 或 限定查找 中不可见,并且仅当 iterator 是参数的关联类时才能通过 参数依赖查找 找到。
operator+(std::ranges::iota_view::iterator)
| friend constexpr /*iterator*/ operator+ ( /*iterator*/ i, difference_type n ) |
(1) | (C++20 起) |
| friend constexpr /*iterator*/ operator+ ( difference_type n, /*iterator*/ i ) |
(2) | (C++20 起) |
等价于 i += n; return i;。
这些函数在普通的 非限定查找 或 限定查找 中不可见,并且仅当 iterator 是参数的关联类时才能通过 参数依赖查找 找到。
operator-(std::ranges::iota_view::iterator)
| friend constexpr /*iterator*/ operator- ( /*iterator*/ i, difference_type n ) |
(1) | (C++20 起) |
| friend constexpr difference_type operator- ( const /*iterator*/& x, const /*iterator*/& y ) |
(2) | (C++20 起) |
D 为 difference_type这些函数在普通的 非限定查找 或 限定查找 中不可见,并且仅当 iterator 是参数的关联类时才能通过 参数依赖查找 找到。
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
|---|---|---|---|
| P2259R1 | C++20 | 成员 iterator_category 始终有定义 |
仅当 W 满足 incrementable 时定义 |
| LWG 3580 | C++20 | operator+ 和 operator- 的主体排除了隐式移动 | 已使其适用于隐式移动 |