std:: iterator_traits
|
Défini dans l'en-tête
<iterator>
|
||
|
template
<
class
Iter
>
struct iterator_traits ; |
||
|
template
<
class
T
>
struct iterator_traits < T * > ; |
||
|
template
<
class
T
>
struct iterator_traits < const T * > ; |
(supprimé en C++20) | |
std::iterator_traits
est la classe de traits de type qui fournit une interface uniforme pour les propriétés des types
LegacyIterator
. Cela permet de mettre en œuvre des algorithmes uniquement en termes d'itérateurs.
Le modèle peut être spécialisé pour les itérateurs définis par l'utilisateur afin que les informations sur l'itérateur puissent être récupérées même si le type ne fournit pas les typedefs habituels.
|
Les spécialisations utilisateur peuvent définir le type imbriqué
|
(depuis C++20) |
Table des matières |
Paramètres du modèle
| Iter | - | le type d'itérateur pour récupérer les propriétés |
Types membres
| Type imbriqué | Définition |
difference_type
|
Iter::difference_type
|
value_type
|
Iter::value_type
|
pointer
|
Iter::pointer
|
reference
|
Iter::reference
|
iterator_category
|
Iter::iterator_category
|
|
Si
|
(depuis C++17)
(jusqu'à C++20) |
||||||||||||||||||||||||||||||||||||
|
Si
Sinon, ce modèle n'a aucun membre portant ces noms (
|
(depuis C++20) |
Spécialisations
Ce trait de type peut être spécialisé pour les types fournis par l'utilisateur qui peuvent être utilisés comme itérateurs. La bibliothèque standard fournit des spécialisations partielles pour les types pointeur
T*
, ce qui permet d'utiliser tous les algorithmes basés sur les itérateurs avec les pointeurs bruts.
|
La bibliothèque standard fournit également des spécialisations partielles pour certains adaptateurs d'itérateurs standard. |
(since C++20) |
T*
spécialisation des types imbriqués
|
Seulement spécialisé si std:: is_object_v < T > est true . |
(depuis C++20) |
| Type imbriqué | Définition |
difference_type
|
std::ptrdiff_t |
value_type
|
T
(jusqu'en C++20)
std::
remove_cv_t
<
T
>
(depuis C++20)
|
pointer
|
T*
|
reference
|
T&
|
iterator_category
|
std::random_access_iterator_tag |
iterator_concept
(depuis C++20)
|
std::contiguous_iterator_tag |
|
const T * types imbriqués de la spécialisation
|
(jusqu'en C++20) |
Spécialisations pour les types de bibliothèque
|
fournit une interface uniforme pour les propriétés du type
std::common_iterator
(spécialisation de modèle de classe) |
|
|
fournit une interface uniforme pour les propriétés du type
std::counted_iterator
(spécialisation de modèle de classe) |
Exemple
Montre une implémentation à usage général de std:: reverse ( ) pour les itérateurs bidirectionnels.
#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 }
Sortie :
5 4 3 2 1 5 4 3 2 1 5 4 3 2 1
Voir aussi
|
(obsolète en C++17)
|
classe de base pour faciliter la définition des types requis pour les itérateurs simples
(modèle de classe) |
|
types de classes vides utilisés pour indiquer les catégories d'itérateurs
(classe) |
|
|
(C++20)
(C++20)
(C++23)
(C++20)
(C++20)
(C++20)
|
calcule les types associés d'un itérateur
(modèle d'alias) |