Namensräume
Varianten
Aktionen

std::iterator_traits

Von cppreference.com
< cpp‎ | iterator
 
 
Iterator-Bibliothek
Iterator-Konzepte
Iterator-Primitive
(veraltet in C++17)
iterator_traits


Algorithmus-Konzepte und Hilfsprogramme
Indirekte aufrufbare Konzepte
Gemeinsame Algorithmus-Anforderungen
(C++20)
(C++20)
(C++20)
Dienstprogramme
(C++20)
Iterator-Adapter
Bereichszugriff
(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 in Header <iterator>
template< class Iter >
struct iterator_traits;
template< class T >
struct iterator_traits<T*>;
template< class T >
struct iterator_traits<const T*>;
(in C++20 entfernt)

std::iterator_traits ist die Typ-Trait-Klasse, die eine einheitliche Schnittstelle zu den Eigenschaften von LegacyIterator-Typen bereitstellt. Dies ermöglicht die Implementierung von Algorithmen nur anhand von Iteratoren.

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

Benutzerspezialisierungen können den verschachtelten Typ iterator_concept auf eine der Iterator-Kategorie-Tags setzen, um die Konformität mit den Iterator-Konzepten anzuzeigen.

(seit C++20)

Inhalt

[bearbeiten] Template-Parameter

Iter - der Iteratortyp, für den Eigenschaften abgerufen werden sollen

[bearbeiten] Member-Typen

Verschachtelter Typ Definition
difference_type Iter::difference_type
value_type Iter::value_type
Zeiger Iter::pointer
Referenz Iter::reference
iterator_category Iter::iterator_category


Wenn Iter keinen der oben genannten fünf verschachtelten Typen hat, hat diese Vorlage keine Member mit diesen Namen (std::iterator_traits ist SFINAE-freundlich).

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

Wenn Iter keinen pointer hat, aber die vier verbleibenden verschachtelten Typen, dann werden diese vier verschachtelten Typen wie folgt deklariert:

Verschachtelter Typ Definition
difference_type Iter::difference_type
value_type Iter::value_type
Zeiger void
Referenz Iter::reference
iterator_category Iter::iterator_category


Andernfalls, wenn Iter das Exposition-only-Konzept __LegacyInputIterator erfüllt, werden die verschachtelten Typen wie folgt deklariert:

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


Andernfalls, wenn Iter das Exposition-only-Konzept __LegacyIterator erfüllt, werden die verschachtelten Typen wie folgt deklariert:

Verschachtelter Typ Definition
difference_type
value_type void
Zeiger void
Referenz void
iterator_category std::output_iterator_tag

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

(seit C++20)

[bearbeiten] Spezialisierungen

Diese Typ-Trait kann für benutzerdefinierte Typen spezialisiert werden, die als Iteratoren verwendet werden können. Die Standardbibliothek stellt partielle Spezialisierungen für Zeigertypen T* bereit, wodurch alle von Iteratoren basierenden Algorithmen mit rohen Zeigern verwendet werden können.

Die Standardbibliothek stellt auch partielle Spezialisierungen für einige Standard-Iterator-Adaptoren bereit.

(seit C++20)

[bearbeiten] T* Spezialisierung verschachtelte Typen

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

(seit C++20)


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


const T* Spezialisierung verschachtelte Typen

Verschachtelter Typ Definition
difference_type std::ptrdiff_t
value_type T
Zeiger const T*
Referenz const T&
iterator_category std::random_access_iterator_tag
(bis C++20)

[bearbeiten] Spezialisierungen für Bibliothekstypen

stellt eine einheitliche Schnittstelle zu den Eigenschaften des Typs std::common_iterator bereit
(Klassenvorlagenspezialisierung) [bearbeiten]
stellt eine einheitliche Schnittstelle zu den Eigenschaften des Typs std::counted_iterator bereit
(Klassenvorlagenspezialisierung) [bearbeiten]

[bearbeiten] 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

[bearbeiten] Siehe auch

(veraltet in C++17)
Basisklasse zur Vereinfachung der Definition der erforderlichen Typen für einfache Iteratoren
(Klassenschablone) [bearbeiten]
leere Klassentypen, die zur Angabe von Iterator-Kategorien verwendet werden
(Klasse) [bearbeiten]
berechnet die zugehörigen Typen eines Iterators
(Alias-Schablone)[bearbeiten]