std::iterator_traits
De cppreference.com
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.
Sommaire |
[modifier] 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
|
[modifier] 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.
[modifier] 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 |
[modifier] 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 |
[modifier] 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 :
5 4 3 2 1 5 4 3 2 1
[modifier] Voir aussi
l'itérateur de base Original: the basic iterator The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (classe générique) | |
types de classes vides utilisés pour indiquer les catégories d'itérateurs Original: empty class types used to indicate iterator categories The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (classe) |