std:: iterator_traits
|
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
|
(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
|
(seit C++17)
(bis C++20) |
||||||||||||||||||||||||||||||||||||
|
Wenn
Andernfalls hat diese Vorlage keine Mitglieder mit diesen Namen (
|
(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
|
(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) |
|
|
(C++20)
(C++20)
(C++23)
(C++20)
(C++20)
(C++20)
|
berechnet die assoziierten Typen eines Iterators
(Alias-Template) |