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

来自cppreference.com
< cpp‎ | ranges‎ | iota view
 
 
范围库
范围访问
范围转换器
(C++23)
范围原语



悬垂迭代器处理
范围概念
视图

范围工厂
适配器
范围生成器
范围适配器对象
范围适配器闭包对象
辅助项
 
std::ranges::iota_view
成员函数
推导指引 (C++20)
辅助概念
decrementable
(C++20)
advanceable
(C++20)
迭代器
iota_view::iterator::iterator
(C++20)
iota_view::iterator::operator*
(C++20)
iota_view::iterator::operator[]
(C++20)
iota_view::iterator::operator++
iota_view::iterator::operator++(int)
(C++20)(C++20)
iota_view::iterator::operator--
iota_view::iterator::operator--(int)
(C++20)(C++20)
iota_view::iterator::operator+=
(C++20)
iota_view::iterator::operator-=
(C++20)
operator==(iota_view::iterator)
operator<(iota_view::iterator)
operator>(iota_view::iterator)
operator<=(iota_view::iterator)
operator>=(iota_view::iterator)
operator<=>(iota_view::iterator)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
operator+(iota_view::iterator)
(C++20)
operator-(iota_view::iterator)
(C++20)
哨位
 
struct /*iterator*/;
(1) (C++20 起)
辅助别名模板
template< class I >
using /*iota-diff-t*/ = /* see below */;  // 仅用于阐释
(2) (C++20 起)
辅助概念
template< class I >

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

  };
(3) (C++20 起)
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) (C++20 起)
1) iota_view::begin 的返回类型。此类的名称(此处示为 /*iterator*/ )是未指明的。
2) 仅用于阐释的别名模板 iota-diff-t 计算迭代器类型和整数式类型的差类型。
  • 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) 仅用于阐释的概念 decrementable 指定类型为 incrementable ,而且该类型的前与后 operator-- 均拥有通常含义。
4) 仅用于阐释的概念 advanceable 指定类型为 decrementabletotally_ordered ,而且该类型与其差类型间的 operator+=operator-=operator+operator- 均拥有通常含义。

语义要求

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

使得 b 可在 n 次应用 ++a 后从 a 可达,下列所有条件都得到满足:

  • (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 W 实现 advanceable 则为 std::random_access_iterator_tag
否则若 W 实现 decrementable 则为 std::bidirectional_iterator_tag
否则若 W 实现 incrementable 则为 std::forward_iterator_tag
否则为 std::input_iterator_tag
iterator_category W 实现 incrementable 则为 std::input_iterator_tag
否则无成员类型 iterator_category
value_type W
difference_type /*iota-diff-t*/<W>

注意: /*iterator*/

然而,若 W 实现 incrementable 则它仅满足老式输入迭代器 (LegacyInputIterator) ,否则不满足老式输入迭代器 (LegacyInputIterator)

数据成员

此迭代器类型的典型实现仅保有一个 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) 经由其默认成员初始化器( = W() )值初始化仅用于阐释的数据成员 value_
2)value 初始化仅用于阐释的数据成员 value_ 。此值将由 operator* 返回,并为 operator++ 所自增。

std::ranges::iota_view::iterator::operator*

constexpr W operator*() const
    noexcept(std::is_nothrow_copy_constructible_v<W>);
(C++20 起)

按值返回当前值(换言之,这是只读视图)。

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;

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;

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

constexpr /*iterator*/& operator+=( difference_type n )
    requires /*advanceable*/<W>;
(C++20 起)

W 为无符号整式,则在 n 非负时进行 value_ += static_cast<W>(n) ,否则进行 value -= static_cast<W>(-n) ,然后返回 *this

否则等价于 value_ += n; return *this;

std::ranges::iota_view::iterator::operator-=

constexpr /*iterator*/& operator-=( difference_type n )
    requires /*advanceable*/<W>;
(C++20 起)

W 为无符号整式,则在 n 非负时进行 value_ -= static_cast<W>(n) ,否则进行 value += static_cast<W>(-n) ,然后返回 *this

否则等价于 value_ -= n; return *this;

std::ranges::iota_view::iterator::operator[]

constexpr W operator[]( difference_type n ) const
    requires /*advanceable*/<W>;
(C++20 起)

等价于 return W(value_ + n);

非成员函数

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) 等价于 return x.value_ == y.value_;
2) 等价于 return x.value_ < y.value_;
3) 等价于 return y < x;
4) 等价于 return !(y < x);
5) 等价于 return !(x < y);
6) 等价于 return x.value_ <=> y.value_;

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

这些函数对通常无限定有限定查找不可见,而只能在 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
  • W 为有符号整数式,等价于 return D(D(x.value_) - D(y.value_));
  • 否则若 W 为无符号整数式,等价于 return y.value_ > x.value_ ? D(-D(y.value_ - x.value_)) : D(x.value_ - y.value_);
  • 否则等价于 return x.value_ - y.value_;

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

缺陷报告

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

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