std::ranges::iota_view<W, Bound>::iterator

来自cppreference.com
< cpp‎ | ranges‎ | iota view
 
 
范围库
范围适配器
 
 
struct /*iterator*/;
(1)(仅用于阐述*)
辅助别名模板
template< class I >
using /*iota-diff-t*/ = /* 见下文 */;
(2)(仅用于阐述*)
辅助概念
template< class I >

concept /*decrementable*/ =
    std::incrementable<I> && requires(I i) {
        { --i } -> std::same_as<I&>;
        { i-- } -> std::same_as<I>;

    };
(3)(仅用于阐述*)
template< class I >

concept /*advanceable*/ =
    /*decrementable*/<I> && std::totally_ordered<I> &&
    requires(I i, const I j, const /*iota-diff-t*/<I> n) {
        { i += n } -> std::same_as<I&>;
        { i -= n } -> std::same_as<I&>;
        I(j + n);
        I(n + j);
        I(j - n);
        { j - j } -> std::convertible_to</*iota-diff-t*/<I>>;

    };
(4)(仅用于阐述*)
1)ranges::iota_view<W, Bound>::iteratorranges::iota_view<W, Bound>begin()end() 返回的迭代器的类型。
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
3) 指定类型为 incrementable,而且该类型的前缀与后缀 operator-- 均拥有通常含义。
4) 指定类型同时为 decrementabletotally_ordered,而且该类型与其差类型间的 operator+=operator-=operator+operator- 均拥有通常含义。

/*iterator*/

然而,只有在 W 实现 incrementable 的情况下它才会满足老式输入迭代器 (LegacyInputIterator) ,否则不满足老式输入迭代器 (LegacyInputIterator)

语义要求

3) 只有在 I 满足 decrementable 且所有它蕴含的概念均得到实现,并且给定相等的 I 类型对象 ab,满足以下条件时,类型 I 才会实现 decrementable
  • 如果 ab 在前缀与后缀 operator-- 的定义域内(即它们可自减),那么以下值都是 true
  • 如果 ab 在前缀与后缀 operator++ 的定义域内(即它们可自增),那么 bool(--(++a) == b)true
4)D 代表 /*iota-diff-t*/<I>。类型 I 只有在 I 满足 advanceable 且所有其所蕴含的概念均得到实现,并且给定
  • I 类型对象 ab
  • D 类型值 n

使得 b 可在 n 次应用 ++a 后从 a 可达,使得下列所有条件都得到满足时才会实现 advanceable

  • (a += n) 等于 b
  • std::addressof(a += n) 等于 std::addressof(a)
  • I(a + n) 等于 (a += n)
  • 对于两个 D 类型的正值 xy,如果 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_typeW
difference_type/*iota-diff-t*/<W>

确定迭代器概念

iterator_concept 定义如下:

数据成员

成员定义
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 起)
1) 值初始化 value_
2)value 初始化 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; // 绑定到临时量
    assert(*it == 6 and r == 6);
    ++it;
    assert(*it == 7 and r == 6);
}

std::ranges::iota_view::iterator::operator++

constexpr /*iterator*/& operator++();
(1)(C++20 起)
constexpr void operator++(int);
(2)(C++20 起)
constexpr /*iterator*/ operator++(int) requires std::incrementable<W>;
(3)(C++20 起)
1) 等价于 ++value_ ; return *this;
2) 等价于 ++value_ ;
3) 等价于 auto tmp = *this; ++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 起)
1) 等价于 --value_ ; return *this;
2) 等价于 auto tmp = *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 )

    requires std::equality_comparable<W>;
(1)(C++20 起)
friend constexpr bool operator<

    ( const /*iterator*/& x, const /*iterator*/& y )

    requires std::totally_ordered<W>;
(2)(C++20 起)
friend constexpr bool operator>

    ( const /*iterator*/& x, const /*iterator*/& y )

    requires std::totally_ordered<W>;
(3)(C++20 起)
friend constexpr bool operator<=

    ( const /*iterator*/& x, const /*iterator*/& y )

    requires std::totally_ordered<W>;
(4)(C++20 起)
friend constexpr bool operator>=

    ( const /*iterator*/& x, const /*iterator*/& y )

    requires std::totally_ordered<W>;
(5)(C++20 起)
friend constexpr bool operator<=>

    ( const /*iterator*/& x, const /*iterator*/& y )

    requires std::totally_ordered<W> && std::three_way_comparable<W>;
(6)(C++20 起)
1) 返回 x.value_ == y.value_
2) 返回 x.value_ < y.value_
3) 返回 y < x
4) 返回 !(y < x)
5) 返回 !(x < y)
6) 返回 x.value_ <=> y.value_

!= 运算符从 operator== 运算符合成

这些函数对常规的无限定有限定查找不可见,而只能在 iterator 为实参的关联类时由实参依赖查找找到。

operator+(std::ranges::iota_view::iterator)

friend constexpr /*iterator*/ operator+

    ( /*iterator*/ i, difference_type n )

    requires /*advanceable*/<W>;
(1)(C++20 起)
friend constexpr /*iterator*/ operator+

    ( difference_type n, /*iterator*/ i )

    requires /*advanceable*/<W>;
(2)(C++20 起)

等价于 i += n; return i;

这些函数对常规的无限定有限定查找不可见,而只能在 iterator 为实参的关联类时由实参依赖查找找到。

operator-(std::ranges::iota_view::iterator)

friend constexpr /*iterator*/ operator-

    ( /*iterator*/ i, difference_type n )

    requires /*advanceable*/<W>;
(1)(C++20 起)
friend constexpr difference_type operator-

    ( const /*iterator*/& x, const /*iterator*/& y )

    requires /*advanceable*/<W>;
(2)(C++20 起)
1) 等价于 i -= n; return i;
2)Ddifference_type

这些函数对常规的无限定有限定查找不可见,而只能在 iterator 为实参的关联类时由实参依赖查找找到。

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告应用于出版时的行为正确行为
P2259R1C++20始终定义成员 iterator_category只有在 W 满足 incrementable 时才定义
LWG 3580C++20operator+operator- 复制迭代器使之移动迭代器