名前空間
変種
操作

std::iterator_traits

提供: cppreference.com
< cpp‎ | iterator
Defined in header <iterator>
template< class Iterator>
struct iterator_traits;
template< class T >
struct iterator_traits<T*>;
template< class T >
struct iterator_traits<const T*>;

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

目次

[編集] メンバー型

メンバー型 Definition
difference_type Iterator::difference_type
value_type Iterator::value_type
pointer Iterator::pointer
reference Iterator::reference
iterator_category Iterator::iterator_category

[編集] 特殊化

この型特性は、反復子として使用できるユーザ定義型に特殊化することができます。標準ライブラリは、生のポインタをすべてのイテレータベースのアルゴリズムを使用できるように、ポインタ型T *の2つの部分特殊化を提供します.

[編集] T *特殊化メンバー型

メンバー型 Definition
difference_type std::ptrdiff_t
value_type T
pointer T*
reference T&
iterator_category std::random_access_iterator_tag

[編集] =const T *特殊化メンバー型

メンバー型 Definition
difference_type std::ptrdiff_t
value_type T
pointer const T*
reference const T&
iterator_category std::random_access_iterator_tag

[編集]

双方向イテレータ用の汎用 reverse()の実装

#include <iostream>
#include <iterator>
#include <vector>
#include <list>
 
template<class BDIter>
void my_reverse(BDIter first, BDIter last)
{
    typename std::iterator_traits<BDIter>::difference_type n = std::distance(first, last);
    --n;
    while(n > 0) {
        typename std::iterator_traits<BDIter>::value_type tmp = *first;
        *first++ = *--last;
        *last = tmp;
        n -= 2;
    }
}
 
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(auto n : l)
        std::cout << n << ' ';
    std::cout << '\n';
 
//    std::istreambuf_iterator<char> i1(std::cin), i2;
//    my_reverse(i1, i2); // compilation error
 
}

出力:

5 4 3 2 1
5 4 3 2 1

[編集] 関連項目

基本イテレータ
(クラステンプレート) [edit]
イテレータのカテゴリを示すために使用される空クラス型
(クラス) [edit]