Erweiterte Iteratortechniken
Iterator-Adapter
Reverse-Iteratoren
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> zahlen = {1, 2, 3, 4, 5};
// Rückwärtsiteration
for (auto rit = zahlen.rbegin(); rit != zahlen.rend(); ++rit) {
std::cout << *rit << " "; // Gibt aus: 5 4 3 2 1
}
return 0;
}
Stream-Iteratoren
#include <iterator>
#include <vector>
#include <iostream>
#include <sstream>
int main() {
std::istringstream eingabe("10 20 30 40 50");
std::vector<int> zahlen;
// Kopieren vom Eingabestream in den Vektor
std::copy(
std::istream_iterator<int>(eingabe),
std::istream_iterator<int>(),
std::back_inserter(zahlen)
);
return 0;
}
Iterator-Operationen
Operation |
Beschreibung |
Beispiel |
advance() |
Verschiebung des Iterators um n Positionen |
std::advance(it, 3) |
distance() |
Berechnung des Abstands zwischen Iteratoren |
std::distance(begin, end) |
next() |
Rückgabe des Iterators n Positionen weiter |
auto new_it = std::next(it, 2) |
prev() |
Rückgabe des Iterators n Positionen zurück |
auto prev_it = std::prev(it, 1) |
Algorithmenintegration
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> zahlen = {5, 2, 8, 1, 9};
// Suchen mit Iteratoren
auto find_it = std::find(zahlen.begin(), zahlen.end(), 8);
if (find_it != zahlen.end()) {
std::cout << "Gefunden: " << *find_it << std::endl;
}
// Sortieren mit Iteratoren
std::sort(zahlen.begin(), zahlen.end());
return 0;
}
Iterator-Traits
#include <iterator>
#include <vector>
#include <iostream>
#include <typeinfo> // Wichtig für typeid
template <typename Iterator>
void printIteratorInfo() {
using traits = std::iterator_traits<Iterator>;
std::cout << "Werttyp: "
<< typeid(typename traits::value_type).name() << std::endl;
std::cout << "Iterator-Kategorie: "
<< typeid(typename traits::iterator_category).name() << std::endl;
}
int main() {
std::vector<int> zahlen = {1, 2, 3};
printIteratorInfo<std::vector<int>::iterator>();
return 0;
}
Gültigkeitsfluss von Iteratoren
stateDiagram-v2
[*] --> Sicher: Gültiger Iterator
Sicher --> Ungültigmachen: Containermodifikation
Ungültigmachen --> Undefiniert: Hängender Iterator
Undefiniert --> [*]: Potentieller Absturz
Best Practices
- Überprüfen Sie immer die Gültigkeit von Iteratoren.
- Verwenden Sie die entsprechende Iterator-Kategorie.
- Verwenden Sie range-basierte for-Schleifen, wenn möglich.
- Seien Sie vorsichtig mit der Ungültigmachung von Iteratoren.
Häufige Fehler
- Dereferenzierung ungültiger Iteratoren
- Falsche Auswahl des Iterator-Typs
- Nichtbeachtung der Einschränkungen der Iterator-Kategorie
LabEx empfiehlt, diese fortgeschrittenen Techniken für eine robuste C++-Programmierung zu beherrschen.