◐ Shell
clean mode source ↗

std::iterator_traits — cppreference.com

De cppreference.com

<tbody> </tbody>

Déclaré dans l'en-tête

<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 est la classe "générique" qui fournit une interface uniforme pour accéder aux propriétés du type itérateur. Cela permet d'implémenter des algorithmes seulement en termes d'itérateurs.

Types des membres

Type de membre Définition
difference_type Iterator::difference_type
value_type Iterator::value_type
pointer Iterator::pointer
reference Iterator::reference
iterator_category Iterator::iterator_category

Spécialisations

std::iterator_traits étant "générique", il peut être spécialisé pour des types donnés par l'utilisateur qui peuvent être utilisés comme des itérateurs. La bibliothèque standard fournit deux spécialisations partielles pour des pointeurs de type T*, ce qui permet d'utiliser tous les algorithmes basés sur des itérateurs avec de simples pointeurs.

Spécialisation T* : types des membres

Type de membre Définition
difference_type std::ptrdiff_t
value_type T
pointer T*
reference T&
iterator_category std::random_access_iterator_tag

Spécialisation const T* : types des membres

Type de membre Définition
difference_type std::ptrdiff_t
value_type T
pointer const T*
reference const T&
iterator_category std::random_access_iterator_tag

Exemple

implémentation universelle de reverse () pour les itérateurs bidirectionnels

#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); // erreur de compilation

}

Résultat :

Voir aussi