Iteratoren und ihr Einsatz in der C++ STL
Lernen Sie Iteratoren in C++ und ihren Einsatz mit STL-Containern und Algorithmen für eine effiziente Datenverarbeitung.
Die C++ Standardbibliothek (STL) basiert auf einer mächtigen Abstraktion namens Iterator, die das Durchlaufen von Datenstrukturen ermöglicht. Iteratoren sind ein zentraler Bestandteil von STL-Containern (vector, list, map, set…) und erlauben das Navigieren von einem Element zum nächsten auf einheitliche Weise. In diesem Artikel werden die verschiedenen Iterator-Arten, ihre Verwendung sowie die Integration in STL-Algorithmen ausführlich erläutert.
1) Was ist ein Iterator?
Ein Iterator ist ein Objekt, das den Zugriff auf Elemente eines Containers ermöglicht. Er verhält sich ähnlich wie ein Zeiger, ist jedoch vollständig von der STL abstrahiert.
Hauptaufgaben von Iteratoren:
- Durchlaufen eines Containers
- Lesen oder Ändern von Elementen
- Zusammenarbeit mit STL-Algorithmen (sort, find, count…)
Beispiel
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v = {10, 20, 30};
vector<int>::iterator it = v.begin();
cout << *it; // 10
}
2) Iterator-Arten
Verschiedene STL-Container unterstützen unterschiedliche Iterator-Kategorien.
- Input Iterator – nur Lesen
- Output Iterator – nur Schreiben
- Forward Iterator – vorwärts
- Bidirectional Iterator – vorwärts + rückwärts
- Random Access Iterator – wie Zeiger, ermöglicht Sprünge
Beispiele:
vector → random access iterator
list → bidirectional iterator
map/set → bidirectional iterator
3) begin() und end()
Alle STL-Container stellen zwei grundlegende Funktionen bereit:
- begin() → zeigt auf das erste Element
- end() → zeigt auf die Position nach dem letzten Element
vector<int> v = {1, 2, 3};
for (auto it = v.begin(); it != v.end(); ++it) {
cout << *it << " ";
}
4) Konstant-Iterator (const_iterator)
Ein const_iterator dient zum Lesen, verhindert jedoch das Ändern der Elemente.
vector<int> v = {10, 20, 30};
vector<int>::const_iterator it = v.begin();
// *it = 50; // FEHLER: const_iterator erlaubt keine Änderungen
cout << *it;
5) Reverse Iterator (rbegin & rend)
Reverse Iteratoren ermöglichen das rückwärts gerichtete Durchlaufen eines Containers.
vector<int> v = {1, 2, 3};
for (auto it = v.rbegin(); it != v.rend(); ++it) {
cout << *it << " ";
}
// Ausgabe: 3 2 1
6) Elemente mit Iteratoren verändern
vector<int> v = {10, 20, 30};
for (auto it = v.begin(); it != v.end(); ++it) {
*it *= 2;
}
for (int x : v)
cout << x << " ";
// Ausgabe: 20 40 60
7) Iteratoren und STL-Algorithmen
Alle STL-Algorithmen arbeiten mit Iteratoren.
sort verwenden
#include <algorithm>
vector<int> v = {50, 20, 10};
sort(v.begin(), v.end());
find verwenden
auto it = find(v.begin(), v.end(), 20);
count verwenden
int c = count(v.begin(), v.end(), 10);
8) Iteration über map und set
#include <map>
#include <iostream>
using namespace std;
int main() {
map<string, int> ages = {
{"Johann", 25},
{"Laura", 30},
{"Michael", 28}
};
for (auto it = ages.begin(); it != ages.end(); ++it) {
cout << it->first << " : " << it->second << endl;
}
}
9) Elemente per Iterator löschen
Iteratoren können gezielt Elemente löschen helfen.
vector<int> v = {10, 20, 30, 40};
auto it = find(v.begin(), v.end(), 20);
if (it != v.end())
v.erase(it);
10) Vorteile der Iterator-Verwendung
- Containerunabhängiges Arbeiten
- Klarer und lesbarer Code
- Vollständige Kompatibilität mit STL-Algorithmen
- Effizienter Speicherzugriff
11) TL;DR
- Iterator: standardisierte Möglichkeit, auf Container-Elemente zuzugreifen
- begin/end → Vorwärtsiteration
- rbegin/rend → Rückwärtsiteration
- const_iterator → nur Lesen
- STL-Algorithmen funktionieren vollständig über Iteratoren
- Beispiele getestet mit Visual Studio 2022 und GCC
Ähnliche Artikel
Die C++-algorithm-Bibliothek: sort, find, count
Lernen Sie die C++-algorithm-Bibliothek mit sort, find, count und weiteren STL-Algorithmen für effiziente Datenverarbeitung.
Einzigartige Elemente mit std::set und std::multiset in C++
Lernen Sie std::set und std::multiset in C++ für eindeutige Elemente, sortierte Sammlungen und effiziente Suchvorgänge.
pair, tuple und Structured Binding in C++
Lernen Sie pair, tuple und Structured Binding in C++, um mehrere Werte effizient und modern zu verwalten.
Schleifen in C++: for, while, do-while
Lernen Sie Schleifen in C++ mit for, while und do-while zur Steuerung wiederholter Abläufe und Programmflüsse.
Schlüssel-Wert-Strukturen mit std::map und std::unordered_map in C++
Lernen Sie std::map und std::unordered_map in C++ für effiziente Schlüssel-Wert-Datenstrukturen und schnelle Suchvorgänge.
Sequenzielle Datenstrukturen mit std::list und std::deque in C++
Lernen Sie std::list und std::deque in C++ kennen, einschließlich Leistungsunterschieden und typischen Einsatzgebieten.
std::vector in C++ verwenden
Lernen Sie die Verwendung von std::vector in C++ für dynamische Arrays und effiziente Datenverwaltung.
Überblick über die C++-Standardbibliothek
Lernen Sie die C++-Standardbibliothek mit STL-Containern, Algorithmen und wichtigen Komponenten für moderne C++-Entwicklung.