名前空間
変種
操作

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

From cppreference.com
< cpp‎ | ranges‎ | iota view
 
 
Rangesライブラリ
Rangeアダプタ
 
 
struct /*iterator*/;
(1) (説明用*)
ヘルパーエイリアステンプレート
template< class I >
using /*iota-diff-t*/ = /* see below */;
(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>::iterator は、ranges::iota_view<W, Bound>begin() および end() によって返されるイテレータの型です。
2) 両方のイテレータ型と 整数型のような型の差分型を計算します。
  • I が整数型でない場合、または整数型であり、かつ 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*/ は以下をモデル化します。

ただし、Wincrementable をモデル化する場合にのみ LegacyInputIterator を満たし、そうでない場合は LegacyInputIterator を満たしません。

目次

[編集] 意味的要求

3)I は、Idecrementable を満たし、それが包含するすべてのコンセプトが満たされ、かつ等しいオブジェクト ab (型 I) が与えられた場合にのみ decrementable をモデル化します。
  • もし ab がプリインクリメントおよびポストインクリメント演算子 operator<< の両方のドメイン内にある(つまり、デクリメント可能である)場合、以下はすべて true です。
  • もし ab がプリインクリメントおよびポストインクリメント演算子 operator<< の両方のドメイン内にある(つまり、インクリメント可能である)場合、bool(--(++a) == b)true です。
4) D/*iota-diff-t*/<I> とします。型 I は、Iadvanceable を満たし、それが包含するすべてのコンセプトが満たされ、かつ
  • オブジェクト ab (型 I) および
  • n (型 D)

ここで、ba から n 回の value_ のインクリメント操作で到達可能である場合、以下のすべての条件が満たされます。

  • (a += n)b に等しい場合にのみモデル化されます。
  • std::addressof(a += n)std::addressof(a) と等しい。
  • I(a + n)(a += n) と等しい。
  • D の任意の二つの正の値 xy について、I(a + D(x + y)) がwell-definedであるならば、I(a + D(x + y))I(I(a + x) + y) と等しい。
  • I(a + D(0))a と等しい。
  • もし I(a + D(1)) がwell-definedであるならば、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 an イテレータタグ、以下を参照
iterator_category
(Wincrementable をモデル化し、
/*iota-diff-t*/<W> が整数型である場合のみ存在する)
std::input_iterator_tag
value_type W
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; // binds with temporary
    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 を返します。

  • もし W符号なし整数型のような型の場合
    • もし n が非負の場合、value_ += static_cast<W>(n) を実行します。
    • それ以外の場合、value_ -= static_cast<W>(-n) を実行します。
  • それ以外の場合、value_ += n を実行します。

#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 を返します。

  • もし W符号なし整数型のような型の場合
    • もし n が非負の場合、value_ -= static_cast<W>(n) を実行します。
    • それ以外の場合、value_ += static_cast<W>(-n) を実行します。
  • それ以外の場合、value_ -= n を実行します。

#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++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
P2259R1 C++20 メンバ iterator_category は常に定義されています。 Wincrementable を満たす場合のみ定義されます。
LWG 3580 C++20 operator+operator- の本体は 暗黙の移動を排除していました。 暗黙の移動に適したものに変更されました。
English 日本語 中文(简体) 中文(繁體)