Dieser Artikel definiert die Grundkonzepte der Standard-C ++ - Bibliothek. Es wird gegeben, um in Zukunft darauf Bezug zu nehmen.
Der größte Teil der C ++ - Standardbibliothek ist die STL (Standard Template Library). Die STL-Bibliothek enthält fünf Haupttypen von Komponenten:
- Container : Steuert eine Reihe von Objekten im Speicher.
- Iterator : Stellt einen Algorithmus für den Algorithmus bereit, um auf den Inhalt des Containers zuzugreifen.
- Algorithmus : Definiert eine Berechnungsprozedur.
- Funktionsobjekt : Kapselt eine Funktion in einem Objekt zur Verwendung durch andere Komponenten.
- Adapter : Passt eine Komponente an, um eine andere Schnittstelle bereitzustellen.

Alle Komponenten erfüllen eine Reihe von Anforderungen und stimmen daher gut überein.
Aus der Definition des Containers folgt, dass jede Benutzerdatenstruktur ein Container ist. In unserem Fall haben
Container Standarddatenstrukturen wie eine Liste, einen Vektor, ein Wörterbuch und viele andere. Die formalen Anforderungen an Container sind recht umfangreich, aber die Grundregel ist der Zugriff auf Elemente. Der Zugriff auf die Elemente des Containers erfolgt über spezielle Objekte -
Iteratoren (siehe unten). Möglicherweise wissen Sie nicht, wie sich die Elemente des Containers im Speicher befinden, aber Sie wissen sicher, dass Iteratoren nacheinander durchlaufen werden können und jeder von ihnen Zugriff auf das Element bietet. Ein Iterator, der auf das erste Element zeigt, kann mit der Methode
iterator begin () erhalten werden
. Behälter. Ein Iterator, der
auf das letzte Element zeigt, kann mit der Methode
iterator end () erhalten werden
. Behälter. Mit anderen Worten, Iteratoren befinden sich in einem
halben Intervall (oder einem
halben Segment), das formal als [Anfang, Ende] geschrieben werden kann. Beispiel für eine Containerdeklaration:
struct a_container { struct an_iterator; an_iterator begin(); an_iterator end(); };
Der erwartete C ++ 20-Standard schlägt vor, eine Struktur zu verwenden, die Halbbereiche - Bereiche einschließt
Ein Iterator ist ein Objekt, das Zugriff auf die Elemente des Containers bietet und deren Sortierung ermöglicht. Ein Iterator ist eine Eigenschaft des Containers. In den ersten Implementierungen der C ++ - Standardbibliothek wurde ein Iterator als Zeiger auf ein Containerelement implementiert. In modernen Implementierungen ist dies eine Klasse, die einen Zeiger auf ein Containerobjekt kapselt.
Die Hauptanforderungen für Iteratoren sind das Vorhandensein von Dereferenzierungs- und Inkrementierungsoperatoren. Unten finden Sie eine Containerdeklaration mit einem Iterator.
template<typename TYPE> struct a_container { struct an_iterator { void operator++(); TYPE& operator*(); }; an_iterator begin(); an_iterator end(); };
Ich kann den Algorithmus nicht besser definieren als den Standardalgorithmus: Ein
Algorithmus ist eine Folge von Aktionen, die in einer endlichen Anzahl von Schritten zu einem gewünschten Ergebnis führen .
Im Fall von STL werden die Algorithmen durch Vorlagenfunktionen implementiert, die halbe Intervalle von Iteratoren als Eingabeparameter verwenden. Die allgemeine Signatur dieser Algorithmen wird wie folgt beschrieben:
template<typename ITERATOR, typename RESULT> RESULT an_algorithm(ITERATOR first, ITERATOR last, ...);
In einer Klassendeklaration können Sie den Operator () überschreiben. Wenn dieser Operator in einer Klasse überschrieben wird, erhalten Objekte dieser Klasse Eigenschaften von Funktionen (sie können als Funktionen verwendet werden). Solche Objekte werden Funktions- oder
Funktoren genannt . Es ist praktisch, Funktoren zu verwenden, wenn eine Funktion "Speicher" haben soll, und Zeiger auf Funktionen zu ersetzen.
Beginnend mit dem C ++ 11-Standard besteht die Möglichkeit einer kurzen Notation von Funktoren - Lambda-Funktionen.
Es gibt keine besonderen Anforderungen an Funktoren. Es sei denn, manchmal ist eine Vererbung von der Funktorfunktion erforderlich (bis zum C ++ 11-Standard - unary_function oder binary_function). Ein kleines Beispiel für eine Funktorimplementierung:
template<typename TYPE> struct plus{ TYPE operator ()(const TYPE& p1, const TYPE& p2) const{ return p1 + p2; } };
STL bietet auch eine Reihe von Klassen und Funktionen (Funktionen), die die Schnittstelle in die richtige umwandeln. Insbesondere gibt es einen Stapeladapter, der einen Stapel basierend auf Containern implementiert. Als Beispiel können wir den Adapter einer Binärfunktion an eine unäre betrachten (im Moment ist diese Funktion im C ++ - Standard veraltet):
template<typename BIDIRECTIONAL_FUNCTION, typename TYPE> class bind1st { BIDIRECTIONAL_FUNCTION _bf; TYPE _first; public: bind1st(BIDIRECTIONAL_FUNCTION bf, TYPE first): _bf(bf), _first(first) {} TYPE operator()(const TYPE& p) const { return _bf(_first, p); } };
Zum unabhängigen Lesen
- C ++ 20 Entwurf auf Github
- C ++ - Referenz
- C ++ - Anwendungsentwicklung
- Range-v3, Vorschlag für Standard