Namespaces
Variants

std:: iterator_traits

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
(deprecated in C++17)
iterator_traits


Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
Definiert im Header <iterator>
template < class Iter >
struct iterator_traits ;
template < class T >
struct iterator_traits < T * > ;
template < class T >
struct iterator_traits < const T * > ;
(entfernt in C++20)

std::iterator_traits ist der Typ-Trait-Klasse, der eine einheitliche Schnittstelle für die Eigenschaften von LegacyIterator -Typen bereitstellt. Dies ermöglicht die Implementierung von Algorithmen ausschließlich auf Basis von Iteratoren.

Die Vorlage kann für benutzerdefinierte Iteratoren spezialisiert werden, sodass die Informationen über den Iterator abgerufen werden können, selbst wenn der Typ nicht die üblichen Typdefinitionen bereitstellt.

Benutzerdefinierte Spezialisierungen können den geschachtelten Typ iterator_concept auf einen der Iterator-Kategorietags definieren, um Konformität mit den Iterator-Konzepten anzuzeigen.

(seit C++20)

Inhaltsverzeichnis

Template-Parameter

Iter - der Iteratortyp zum Abrufen von Eigenschaften

Mitgliedertypen

Geschachtelter Typ Definition
difference_type Iter::difference_type
value_type Iter::value_type
pointer Iter::pointer
reference Iter::reference
iterator_category Iter::iterator_category


Wenn Iter keine der fünf oben genannten geschachtelten Typen besitzt, dann hat diese Vorlage keine Mitglieder mit diesen Namen ( std::iterator_traits ist SFINAE-freundlich).

(seit C++17)
(bis C++20)

Wenn Iter nicht über pointer verfügt, aber alle vier verbleibenden geschachtelten Typen besitzt, dann werden diese vier geschachtelten Typen wie folgt deklariert:

Geschachtelter Typ Definition
difference_type Iter::difference_type
value_type Iter::value_type
pointer void
reference Iter::reference
iterator_category Iter::iterator_category


Andernfalls, wenn Iter das nur zur Darstellung dienende Konzept __LegacyInputIterator erfüllt, werden die geschachtelten Typen wie folgt deklariert:

Geschachtelter Typ Definition
difference_type std:: incrementable_traits < Iter > :: difference_type
value_type std:: indirectly_readable_traits < Iter > :: value_type
pointer
  • Iter::pointer falls gültig.
  • Andernfalls decltype ( std:: declval < Iter & > ( ) . operator - > ( ) ) falls gültig.
  • Andernfalls void .
reference
iterator_category


Andernfalls, wenn Iter das nur zur Darstellung dienende Konzept __LegacyIterator erfüllt, werden die geschachtelten Typen wie folgt deklariert:

Geschachtelter Typ Definition
difference_type
value_type void
pointer void
reference void
iterator_category std::output_iterator_tag

Andernfalls hat diese Vorlage keine Mitglieder mit diesen Namen ( std::iterator_traits ist SFINAE-freundlich).

(seit C++20)

Spezialisierungen

Dieses Typ-Merkmal kann für benutzerdefinierte Typen spezialisiert werden, die als Iteratoren verwendet werden können. Die Standardbibliothek bietet partielle Spezialisierungen für Zeigertypen T* , was die Verwendung aller iteratorbasierten Algorithmen mit Rohzeigern ermöglicht.

Die Standardbibliothek bietet auch partielle Spezialisierungen für einige Standard-Iterator-Adapter.

(since C++20)

T* Spezialisierung verschachtelte Typen

Nur spezialisiert, wenn std:: is_object_v < T > true ist.

(since C++20)


Geschachtelter Typ Definition
difference_type std::ptrdiff_t
value_type T (bis C++20) std:: remove_cv_t < T > (seit C++20)
pointer T*
reference T&
iterator_category std::random_access_iterator_tag
iterator_concept (seit C++20) std::contiguous_iterator_tag


const T * Spezialisierung geschachtelte Typen

Geschachtelter Typ Definition
difference_type std::ptrdiff_t
value_type T
pointer const T *
reference const T &
iterator_category std::random_access_iterator_tag
(bis C++20)

Spezialisierungen für Bibliothekstypen

Bietet eine einheitliche Schnittstelle für die Eigenschaften des std::common_iterator -Typs
(Klassen-Template-Spezialisierung)
Bietet eine einheitliche Schnittstelle für die Eigenschaften des std::counted_iterator -Typs
(Klassen-Template-Spezialisierung)

Beispiel

Zeigt eine allgemeine Implementierung von std:: reverse ( ) für bidirektionale Iteratoren.

#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
}

Ausgabe:

5 4 3 2 1
5 4 3 2 1
5 4 3 2 1

Siehe auch

(in C++17 veraltet)
Basisklasse zur Vereinfachung der Definition erforderlicher Typen für einfache Iteratoren
(Klassen-Template)
leere Klassentypen, die zur Kennzeichnung von Iteratorkategorien verwendet werden
(Klasse)
berechnet die assoziierten Typen eines Iterators
(Alias-Template)