std::iterator_traits — cppreference.com
De cppreference.com
<tbody> </tbody>
| Déclaré dans l'en-tête <iterator> |
||
|
|
||
|
|
||
|
|
||
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 :