std::ranges::iota_view<W, Bound>::iterator
来自cppreference.com
| (1) | (仅用于阐述*) | |
| 辅助别名模板 |
||
| (2) | (仅用于阐述*) | |
| 辅助概念 |
||
| (3) | (仅用于阐述*) | |
| (4) | (仅用于阐述*) | |
2) 计算迭代器类型和整数式类型的差类型。
- 如果
W不是整数类型,或是整数类型且sizeof(std::iter_difference_t<I>)大于sizeof(I),那么/*iota-diff-t*/<I>是std::iter_difference_t<I>。 - 否则,
/*iota-diff-t*/<I>是宽度大于I的有符号整数类型,如果这种类型存在。 - 否则,
I是最宽的整数类型之一,而/*iota-diff-t*/<I>是宽度不小于I的未指明的有符号整数式类型。此时不指定/*iota-diff-t*/<I>是否实现 weakly_incrementable。
4) 指定类型同时为
decrementable 及 totally_ordered,而且该类型与其差类型间的 operator+=、operator-=、operator+ 和 operator- 均拥有通常含义。/*iterator*/
- 在
W实现advanceable时实现 random_access_iterator (4), - 在
W实现decrementable时实现 bidirectional_iterator (3), - 在
W实现 incrementable 时实现 forward_iterator, - 否则实现 input_iterator。
然而,只有在 W 实现 incrementable 的情况下它才会满足老式输入迭代器 (LegacyInputIterator) ,否则不满足老式输入迭代器 (LegacyInputIterator) 。
目录
- 1 语义要求
- 2 嵌套类型
- 3 数据成员
- 4 成员函数
- 5 std::ranges::iota_view::iterator::iterator
- 6 std::ranges::iota_view::iterator::operator*
- 7 std::ranges::iota_view::iterator::operator++
- 8 std::ranges::iota_view::iterator::operator--
- 9 std::ranges::iota_view::iterator::operator+=
- 10 std::ranges::iota_view::iterator::operator-=
- 11 std::ranges::iota_view::iterator::operator[]
- 12 operator==, <, >, <=, >=, <=>(std::ranges::iota_view::iterator)
- 13 operator+(std::ranges::iota_view::iterator)
- 14 operator-(std::ranges::iota_view::iterator)
语义要求
3) 只有在
I 满足 decrementable 且所有它蕴含的概念均得到实现,并且给定相等的 I 类型对象 a 与 b,满足以下条件时,类型 I 才会实现 decrementable:
- 如果
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。
4) 令
D 代表 /*iota-diff-t*/<I>。类型 I 只有在 I 满足 advanceable 且所有其所蕴含的概念均得到实现,并且给定
I类型对象a与b及D类型值n,
使得 b 可在 n 次应用 ++a 后从 a 可达,使得下列所有条件都得到满足时才会实现 advanceable:
(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::operator*
| |
(C++20 起) | |
返回 value_。
示例
Run this code
#include <cassert>
#include <ranges>
int main()
{
auto it{std::views::iota(6, 9).begin()};
const int& r = *it; // 绑定到临时量
assert(*it == 6 and r == 6);
++it;
assert(*it == 7 and r == 6);
}
std::ranges::iota_view::iterator::operator++
| |
(1) | (C++20 起) |
| |
(2) | (C++20 起) |
| |
(3) | (C++20 起) |
1) 等价于
++value_ ; return *this;。2) 等价于
++value_ ;。3) 等价于
auto tmp = *this; ++value_ ; return tmp;。示例
Run this code
#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--
| |
(1) | (C++20 起) |
| |
(2) | (C++20 起) |
1) 等价于
--value_ ; return *this;。2) 等价于
auto tmp = *this; --value_ ; return tmp;。示例
Run this code
#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+=
| |
(C++20 起) | |
更新 value_ 并返回 *this:
示例
Run this code
#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-=
| |
(C++20 起) | |
更新 value_ 并返回 *this:
示例
Run this code
#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[]
| |
(C++20 起) | |
返回 W(value_ + n)。
示例
Run this code
#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)
| |
(1) | (C++20 起) |
| |
(2) | (C++20 起) |
| |
(3) | (C++20 起) |
| |
(4) | (C++20 起) |
| |
(5) | (C++20 起) |
| |
(6) | (C++20 起) |
3) 返回
y < x。4) 返回
!(y < x)。5) 返回
!(x < y)。!= 运算符从 operator== 运算符合成。
operator+(std::ranges::iota_view::iterator)
| |
(1) | (C++20 起) |
| |
(2) | (C++20 起) |
等价于 i += n; return i;。
operator-(std::ranges::iota_view::iterator)
| |
(1) | (C++20 起) |
| |
(2) | (C++20 起) |
1) 等价于
i -= n; return i;。2) 设
D 为 difference_type:
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| P2259R1 | C++20 | 始终定义成员 iterator_category
|
只有在 W 满足 incrementable 时才定义
|
| LWG 3580 | C++20 | operator+ 与 operator- 复制迭代器
|
使之移动迭代器 |