Die Richtlinien zum Schreiben eines benutzerdefinierten STL-Containers
Beim Entwerfen eines neuen Containers, der den STL-Konventionen entspricht, ist es wichtig, bestimmte Richtlinien zu befolgen um das ordnungsgemäße Verhalten und die Integration mit der STL-Bibliothek sicherzustellen.
Iterator Schnittstelle:
- Definieren Sie eine Iteratorklasse mit einem geeigneten iterator_category-Tag, wie etwa input_iterator_tag, Output_iterator_tag, forward_iterator_tag, bidirektionaler_iterator_tag oder random_access_iterator_tag.
- Stellen Sie Mitgliedsfunktionen für den Vergleich bereit (= =, !=), inkrementieren/dekrementieren ( , --), Arithmetische ( , -) und Dereferenzierungsoperationen (*, ->).
Const Iterator:
- Stellen Sie eine in der verschachtelte const_iterator-Klasse bereit Iterator-Klasse, die eine Iteration über konstante Container ermöglicht.
- Definieren Sie dieselben Mitgliedsfunktionen wie die Nicht-Konstanten Iterator, aber mit konstanten Referenzen und Zeigern.
Vergleich und Zuweisung:
- Implementieren Sie Vergleichsoperatoren (==, !=, , =) für den Container selbst.
- Stellen Sie einen Zuweisungsoperator bereit, der einen Verweis auf einen anderen annimmt Container.
Kapazität und Zugriff:
- Enthalten Sie Mitgliedsfunktionen wie empty(), size(), max_size(), um die Containergröße zu verwalten und Kapazität.
- Stellen Sie begin(), end(), cbegin(), cend(), rbegin(), rend(), crbegin() und crend() bereit Zugriff auf Iteratoren, die die Elemente des Containers darstellen.
- Definieren Sie Funktionen wie front(), back(), at() und Operator[], um auf Elemente zuzugreifen oder diese zu ändern.
Einfügungen und Löschungen:
- Implementieren Sie emplace_front(), emplace_back(), push_front(), push_back(), pop_front() und pop_back() zum Einfügen und Löschen von Elementen.
- Stellen Sie die Memberfunktionen emplace(), insert() und erase() zum Einfügen und Entfernen von Elementen innerhalb des Containers bereit.
Verschiedenes:
- Fügen Sie eine swap()-Memberfunktion hinzu, um den Inhalt auszutauschen zwei Container desselben Typs.
- Implementieren Sie get_allocator(), um den mit dem Container verknüpften Allokator abzurufen.
- Definieren Sie eine freistehende swap()-Funktion zum Austauschen von Containern desselben Typs.
Testen:
Um die Zuverlässigkeit Ihres Containers sicherzustellen, verwenden Sie eine Testklasse wie die bereitgestellte Testerklasse, um zu überprüfen, dass:
- Die Lebensdauer des Objekts ordnungsgemäß verwaltet wird.
- Funktionsaufrufe ändern den Status des Objekts nicht unerwartet.
- Der Container funktioniert ordnungsgemäß, wenn er erstellt wird mit und ohne globale Objekte.