最終更新日時:
が更新

履歴 編集

class template
<iterator>

std::iterator

namespace std {
  template<class Category,
           class T,
           class Distance = ptrdiff_t,
           class Pointer = T*,
           class Reference = T&>
  struct iterator {
    typedef T value_type;
    typedef Distance difference_type;
    typedef Pointer pointer;
    typedef Reference reference;
    typedef Category iterator_category;
  };
}

概要

std::iteratorクラスは、イテレータを定義するための基本クラスである。

イテレータ定義に必要ないくつかのtypedefを簡略化するために使用できる。

テンプレートパラメータ 説明
Category イテレータの分類。 (参照: iterator tag)
T イテレータが指す値型
Distance イテレータ間の差を表す不動あり整数型。 デフォルトはstd::ptrdiff_t
Pointer イテレータが指す値のポインタ型 デフォルトはT*
Reference イテレータが指す値の参照型 デフォルトはT&

#include <iostream>
#include <iterator>
#include <algorithm>

// インクリメントするイテレータ
class increment_iterator
    : public std::iterator<std::input_iterator_tag, int> {

  int x_;

public:
  increment_iterator(int x = 0) : x_(x) {}

  increment_iterator& operator++()
  {
    ++x_;
    return *this;
  }

  increment_iterator operator++(int)
  {
    int tmp = x_;
    ++x_;
    return increment_iterator(tmp);
  }

  int operator*() const
    { return x_; }
};

inline bool operator==(const increment_iterator& a, const increment_iterator& b)
  { return *a == *b; }

inline bool operator!=(const increment_iterator& a, const increment_iterator& b)
  { return !(a == b); }

inline bool operator<(const increment_iterator& a, const increment_iterator& b)
  { return *a < *b; }

inline bool operator<=(const increment_iterator& a, const increment_iterator& b)
  { return !(b < a); }

inline bool operator>(const increment_iterator& a, const increment_iterator& b)
  { return b < a; }

inline bool operator>=(const increment_iterator& a, const increment_iterator& b)
  { return !(a < b); }

int main()
{
  increment_iterator first(0);
  increment_iterator last(10);

  std::for_each(first, last, [](int x) {
    std::cout << x << std::endl;
  });
}

出力

0
1
2
3
4
5
6
7
8
9

参照

  • std::iteratorは型定義のみを簡略化するが、これを発展させたBoost Iterators Libraryは、演算子定義も簡略化する機能を提供している。