std::iterator_traits
| 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 |
(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 |
(seit C++17) (bis C++20) | ||||||||||||||||||||||||||||||||||||
|
Wenn
Andernfalls hat diese Vorlage keine Member mit diesen Namen ( |
(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
|
(bis C++20) |
[bearbeiten] Spezialisierungen für Bibliothekstypen
| stellt eine einheitliche Schnittstelle zu den Eigenschaften des Typs std::common_iterator bereit (Klassenvorlagenspezialisierung) | |
| stellt eine einheitliche Schnittstelle zu den Eigenschaften des Typs std::counted_iterator bereit (Klassenvorlagenspezialisierung) |
[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) |
| leere Klassentypen, die zur Angabe von Iterator-Kategorien verwendet werden (Klasse) | |
| (C++20)(C++20)(C++23)(C++20)(C++20)(C++20) |
berechnet die zugehörigen Typen eines Iterators (Alias-Schablone) |