GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • cpprefjp - C++日本語リファレンス
  • GitHub Project

This view

  • Original page
  • New address

GeezerVison is showing cpprefjp.github.io — std::iterator - cpprefjp C++日本語リファレンス

  1. リファレンス
  2. iterator
  3. iterator

最終更新日時: 2019年07月08日 17時12分44秒 (JST)
Mitsuru Kariya が更新

履歴 編集

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

参照

  • std::iteratorは型定義のみを簡略化するが、これを発展させたBoost Iterators Libraryは、演算子定義も簡略化する機能を提供している。
  • P0174R2 Deprecating Vestigial Library Parts in C++17
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.