名前空間
変種
操作

std::iterator

提供: cppreference.com
< cpp‎ | iterator
ヘッダ <iterator> で定義
template<

    class Category,
    class T,
    class Distance = std::ptrdiff_t,
    class Pointer = T*,
    class Reference = T&

> struct iterator;
(C++17で非推奨)

std::iterator はイテレータのために要求される型の定義を簡単にするために提供される基底クラスです。

目次

[編集] テンプレート引数

Category - イテレータのカテゴリ。 イテレータカテゴリタグのいずれかでなければなりません
T - イテレータを逆参照することによって取得できる値の型。 この型は出力イテレータに対しては void であるべきです
Distance - イテレータ間の距離を表すために使用できる型
Pointer - イテレートする型 (T) を指すポインタを定義します
Reference - イテレートする型 (T) を指す参照を定義します

[編集] メンバ型

メンバ型 定義
iterator_category Category
value_type T
difference_type Distance
pointer Pointer
reference Reference

[編集]

以下の例は std::iterator を継承して入力イテレータを実装する方法を示します。

#include <iostream>
#include <algorithm>
 
template<long FROM, long TO>
class Range {
public:
    // member typedefs provided through inheriting from std::iterator
    class iterator: public std::iterator<
                        std::input_iterator_tag,   // iterator_category
                        long,                      // value_type
                        long,                      // difference_type
                        const long*,               // pointer
                        long                       // reference
                                      >{
        long num = FROM;
    public:
        explicit iterator(long _num = 0) : num(_num) {}
        iterator& operator++() {num = TO >= FROM ? num + 1: num - 1; return *this;}
        iterator operator++(int) {iterator retval = *this; ++(*this); return retval;}
        bool operator==(iterator other) const {return num == other.num;}
        bool operator!=(iterator other) const {return !(*this == other);}
        reference operator*() const {return num;}
    };
    iterator begin() {return iterator(FROM);}
    iterator end() {return iterator(TO >= FROM? TO+1 : TO-1);}
};
 
int main() {
    // std::find requires a input iterator
    auto range = Range<15, 25>();
    auto itr = std::find(range.begin(), range.end(), 18);
    std::cout << *itr << '\n'; // 18
 
    // Range::iterator also satisfies range-based for requirements
    for(long l : Range<3, 5>()) {
        std::cout << l << ' '; // 3 4 5
    }
    std::cout << '\n';
}

出力:

18
3 4 5

[編集] 関連項目

イテレータの性質への統一されたインタフェースを提供します
(クラステンプレート) [edit]
イテレータのカテゴリを示すために使用される空クラス型
(クラス) [edit]