C++ STL-Tutorial
Die C++ Standard Template Library (STL) ist eine leistungsstarke Sammlung von C++-Template-Klassen und -Funktionen, die eine Reihe generischer, wiederverwendbarer Algorithmen und Datenstrukturen bereitstellt.
Das Design der STL basiert auf generischer Programmierung, was bedeutet, dass Templates verwendet werden können, um Code unabhängig von einem bestimmten Datentyp zu schreiben.
Die STL ist in mehrere Komponenten unterteilt, darunter Container, Iteratoren, Algorithmen, Funktionsobjekte und Adapter usw.
Vorteile der Verwendung von STL:
- Code-Wiederverwendung: STL bietet eine große Anzahl generischer Datenstrukturen und Algorithmen, wodurch der Aufwand für das Schreiben von repetitivem Code reduziert wird.
- Leistungsoptimierung: Die Algorithmen und Datenstrukturen in STL sind optimiert, um die beste Leistung zu bieten.
- Generische Programmierung: Mithilfe von Templates unterstützt STL die generische Programmierung, sodass Algorithmen und Datenstrukturen auf jeden Datentyp angewendet werden können.
- Einfach zu warten: Das Design von STL macht Code modularer und leichter zu lesen und zu warten.
Der Kern der C++-Standard Template Library umfasst die folgenden wichtigen Komponenten:
| Komponenten | Beschreibung |
|---|---|
| Container | Container sind eine der grundlegendsten Komponenten in STL. Sie bieten verschiedene Datenstrukturen, darunter vector, list, queue, stack, set, map und so weiter. Diese Container haben unterschiedliche Eigenschaften und Verwendungszwecke, daher können Sie den passenden Container basierend auf den tatsächlichen Anforderungen auswählen. |
| Algorithmen | STL bietet eine große Anzahl von Algorithmen zum Ausführen verschiedener Operationen an Elementen in Containern, darunter Sortieren, Suchen, Kopieren, Verschieben, Transformieren usw. Bei der Verwendung dieser Algorithmen müssen Sie sich nicht um den spezifischen Containertyp kümmern; Sie müssen nur den zu bearbeitenden Bereich angeben. |
| Iteratoren | Iteratoren werden verwendet, um die Elemente in Containern zu durchlaufen, sodass auf Elemente auf einheitliche Weise zugegriffen werden kann, ohne sich um die internen Implementierungsdetails des Containers kümmern zu müssen. STL bietet viele Arten von Iteratoren, darunter Random-Access-Iteratoren, bidirektionale Iteratoren, Vorwärtsiteratoren sowie Eingabe-/Ausgabe-Iteratoren und andere. |
| Funktionsobjekte | Funktionsobjekte sind Objekte, die wie Funktionen aufgerufen werden können und für verschiedene Operationen in Algorithmen verwendet werden können. STL bietet eine Vielzahl von Funktionsobjekten, darunter unäre Funktionsobjekte, binäre Funktionsobjekte, Prädikate und mehr, um unterschiedliche Anforderungen zu erfüllen. |
| Adapter | Adapter werden verwendet, um einen Container oder Iterator an einen anderen Container oder Iterator anzupassen, um spezifische Anforderungen zu erfüllen. STL bietet eine Vielzahl von Adaptern, darunter Stack-Adapter, Warteschlangen-Adapter und Prioritätswarteschlangen-Adapter unter anderem. |
Alle diese Komponenten bringen einen umfangreichen Satz vordefinierter Funktionen mit, die uns helfen, komplexe Aufgaben auf einfache Weise zu bewältigen.
Container
Container sind Sequenzen, die zum Speichern von Daten verwendet werden, und sie bieten unterschiedliche Speichermethoden und Zugriffsmodi.
Container in STL können in drei Kategorien unterteilt werden:
1. Sequenzcontainer: speichern Sequenzen von Elementen und ermöglichen bidirektionales Durchlaufen.
- std::vector: dynamisches Array, unterstützt schnellen wahlfreien Zugriff.
- std::deque: doppelendige Warteschlange, unterstützt schnelles Einfügen und Löschen.
- std::list: verkettete Liste, unterstützt schnelles Einfügen und Löschen, unterstützt jedoch keinen wahlfreien Zugriff.
2. Assoziative Container: speichern Schlüssel-Wert-Paare. Jedes Element hat einen Schlüssel und einen Wert, und die Elemente werden nach Schlüsseln organisiert.
- std::set: Menge, doppelte Elemente sind nicht erlaubt.
- std::multiset: Multimenge, erlaubt, dass mehrere Elemente denselben Schlüssel haben.
- std::map: Map, jedem Schlüssel wird ein Wert zugeordnet.
- std::multimap: multimap, speichert Schlüssel-Wert-Paare (pair), wobei Schlüssel nicht eindeutig sind und Werte wiederholt werden können, sodass ein Schlüssel auf mehrere Werte abgebildet werden kann.
3. Ungeordnete Container (in C++11 eingeführt): Hash-Tabellen, unterstützen schnelles Nachschlagen, Einfügen und Löschen.
- std::unordered_set: ungeordnetes Set.
- std::unordered_multiset: ungeordnetes Multiset.
- std::unordered_map: ungeordnete Map.
- std::unordered_multimap: ungeordnete Multimap.
Das folgende Programm demonstriert den vector-Container (ein C++-Standardtemplate), der einem Array sehr ähnlich ist. Der einzige Unterschied besteht darin, dass der vector, wenn er seine Größe erweitern muss, automatisch seinen eigenen Speicherbedarf verwaltet:
Beispiel
Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:
vector size = 0 extended vector size = 5 value of vec [0] = 0 value of vec [1] = 1 value of vec [2] = 2 value of vec [3] = 3 value of vec [4] = 4 value of v = 0 value of v = 1 value of v = 2 value of v = 3 value of v = 4
Bezüglich der verschiedenen Funktionen, die im obigen Beispiel verwendet werden, gibt es einige Punkte zu beachten:
- Die Memberfunktion push_back( ) fügt einen Wert am Ende des Vektors ein und erweitert die Größe des Vektors, falls erforderlich.
- Die Funktion size( ) zeigt die Größe des Vektors an.
- Die Funktion begin( ) gibt einen Iterator zurück, der auf den Anfang des Vektors zeigt.
- Die Funktion end( ) gibt einen Iterator zurück, der auf das Ende des Vektors zeigt.
STL ist ein unverzichtbarer Teil der C++-Programmierung. Es erweitert die Funktionalität von C++ erheblich und ermöglicht Programmierern, effizienteren und besser lesbaren Code zu schreiben.
Die Beherrschung der Verwendung von STL ist für jeden C++-Programmierer sehr wichtig.
Weitere Erweiterungen