最終更新日時(UTC):
が更新

履歴 編集

class template
<iterator>

std::iterator(C++17で非推奨)

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

この機能は、C++17から非推奨となった。

概要

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

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

テンプレートパラメータ 説明
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

参照