Namespaces
Variants

std:: iterator_traits

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
(deprecated in C++17)
iterator_traits


Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
ヘッダーで定義 <iterator>
template < class Iter >
struct iterator_traits ;
template < class T >
struct iterator_traits < T * > ;
template < class T >
struct iterator_traits < const T * > ;
(C++20で削除)

std::iterator_traits は、 LegacyIterator 型のプロパティに対する統一インターフェースを提供する型特性クラスです。これにより、イテレータのみを用いてアルゴリズムを実装することが可能になります。

このテンプレートはユーザー定義イテレータに対して特殊化でき、その型が通常のtypedefを提供していない場合でもイテレータに関する情報を取得できるようにします。

ユーザー定義特殊化は、ネストされた型 iterator_concept イテレータカテゴリタグ のいずれかに定義して、イテレータコンセプトへの適合性を示すことができます。

(C++20以降)

目次

テンプレートパラメータ

Iter - プロパティを取得するためのイテレータ型

メンバー型

ネスト型 定義
difference_type Iter::difference_type
value_type Iter::value_type
pointer Iter::pointer
reference Iter::reference
iterator_category Iter::iterator_category


Iter が上記の5つのネスト型をいずれも持たない場合、このテンプレートはそれらの名前のメンバーを持たない( std::iterator_traits はSFINAEフレンドリーである)。

(C++17以降)
(C++20以前)

Iter pointer を持たないが、残りの4つのネスト型をすべて持つ場合、これらの4つのネスト型は以下のように宣言される:

ネスト型 定義
difference_type Iter::difference_type
value_type Iter::value_type
pointer void
reference Iter::reference
iterator_category Iter::iterator_category


それ以外の場合、 Iter が説明専用コンセプト __LegacyInputIterator を満たす場合、ネスト型は以下のように宣言される:

ネスト型 定義
difference_type std:: incrementable_traits < Iter > :: difference_type
value_type std:: indirectly_readable_traits < Iter > :: value_type
pointer
  • Iter::pointer が有効な場合。
  • それ以外の場合 decltype ( std:: declval < Iter & > ( ) . operator - > ( ) ) が有効な場合。
  • それ以外の場合 void
reference
iterator_category


それ以外の場合、 Iter が説明専用コンセプト __LegacyIterator を満たす場合、ネスト型は以下のように宣言される:

ネスト型 定義
difference_type
value_type void
pointer void
reference void
iterator_category std::output_iterator_tag

それ以外の場合、このテンプレートはそれらの名前のメンバーを持たない( std::iterator_traits はSFINAEフレンドリーである)。

(C++20以降)

特殊化

この型特性は、イテレータとして使用される可能性があるユーザー提供の型に対して特殊化することができます。標準ライブラリはポインタ型 T* に対して部分特殊化を提供しており、これにより生ポインタをすべてのイテレータベースのアルゴリズムで使用できるようになります。

標準ライブラリはまた、一部の標準イテレータアダプタに対する部分特殊化も提供します。

(since C++20)

T* 特殊化ネスト型

std:: is_object_v < T > true の場合にのみ特殊化される。

(C++20以降)


ネスト型 定義
difference_type std::ptrdiff_t
value_type T (C++20以前) std:: remove_cv_t < T > (C++20以降)
pointer T*
reference T&
iterator_category std::random_access_iterator_tag
iterator_concept (C++20以降) std::contiguous_iterator_tag


const T * 特殊化のネストされた型

ネストされた型 定義
difference_type std::ptrdiff_t
value_type T
pointer const T *
reference const T &
iterator_category std::random_access_iterator_tag
(C++20まで)

ライブラリ型の特殊化

std::common_iterator 型のプロパティに対する統一インターフェースを提供する
(クラステンプレート特殊化)
std::counted_iterator 型のプロパティに対する統一インターフェースを提供する
(クラステンプレート特殊化)

双方向イテレータ向けの汎用的な std:: reverse ( ) の実装例を示します。

#include <iostream>
#include <iterator>
#include <list>
#include <vector>
template<class BidirIt>
void my_reverse(BidirIt first, BidirIt last)
{
    typename std::iterator_traits<BidirIt>::difference_type n = std::distance(first, last);
    for (--n; n > 0; n -= 2)
    {
        typename std::iterator_traits<BidirIt>::value_type tmp = *first;
        *first++ = *--last;
        *last = tmp;
    }
}
int main()
{
    std::vector<int> v{1, 2, 3, 4, 5};
    my_reverse(v.begin(), v.end());
    for (int n : v)
        std::cout << n << ' ';
    std::cout << '\n';
    std::list<int> l{1, 2, 3, 4, 5};
    my_reverse(l.begin(), l.end());
    for (int n : l)
        std::cout << n << ' ';
    std::cout << '\n';
    int a[]{1, 2, 3, 4, 5};
    my_reverse(a, a + std::size(a));
    for (int n : a)
        std::cout << n << ' ';
    std::cout << '\n';
//  std::istreambuf_iterator<char> i1(std::cin), i2;
//  my_reverse(i1, i2); // compilation error: i1, i2 are input iterators
}

出力:

5 4 3 2 1
5 4 3 2 1
5 4 3 2 1

関連項目

(C++17で非推奨)
単純なイテレータの必要な型定義を容易にする基底クラス
(クラステンプレート)
イテレータカテゴリを示すために使用される空のクラス型
(クラス)
イテレータの関連型を計算する
(エイリアステンプレート)