Gibt es Richtlinien, wie man einen neuen Container schreibt, der sich wie jeder STL
Container verhält ?
c++
stl
c++-standard-library
Avinash
quelle
quelle
Antworten:
Hier ist eine Sequenz pseudo-Container I zusammengestückelt aus § 23.2.1 \ 4 Beachten Sie, dass die
iterator_category
eine der folgenden sein solltestd::input_iterator_tag
,std::output_iterator_tag
,std::forward_iterator_tag
,std::bidirectional_iterator_tag
,std::random_access_iterator_tag
. Beachten Sie auch, dass das Folgende technisch strenger als erforderlich ist, aber dies ist die Idee. Beachten Sie, dass die überwiegende Mehrheit der "Standard" -Funktionen technisch optional ist, da es sich um Iteratoren handelt.Wenn ich einen Container mache, teste ich mit einer Klasse, die mehr oder weniger so aussieht:
Erstellen Sie Container mit
tester
Objekten und rufen Sie jeden an,function()
während Sie Ihren Container testen. Machen Sie keine globalentester
Objekte. Wenn Ihr Container irgendwo betrügt, wird diesetester
Klasseassert
und Sie werden wissen, dass Sie versehentlich irgendwo betrogen haben.quelle
assert(tester::livecount == 0);
. Mmmmm, ich bin mir immer noch nicht sicher, wie dieses Tester-Framework funktioniert. Könnten Sie ein Beispiel geben?memcpy
Element aufgetreten ist. (Test ist nicht narrensicher, aber es fängt einige). Dieslivecount
ist ein einfacher Lecksucher, um sicherzustellen, dass Ihr Container eine gleiche Anzahl von Konstruktoren und Destruktoren enthält.verifier
nichtvarifier
.std::iterator
Header zu erben<iterator>
Sie müssen den Abschnitt C ++ Standard über Container und Anforderungen lesen, die der C ++ Standard für Containerimplementierungen auferlegt.
Das relevante Kapitel im C ++ 03-Standard lautet:
Abschnitt 23.1 Containeranforderungen
Das relevante Kapitel im C ++ 11-Standard lautet:
Abschnitt 23.2 Containeranforderungen
Der nahezu endgültiger Entwurf des C ++ 11 - Standard ist frei verfügbar hier .
Sie können auch einige ausgezeichnete Bücher lesen, die Ihnen helfen, die Anforderungen aus der Sicht des Benutzers des Containers zu verstehen. Zwei ausgezeichnete Bücher, die mir leicht in den Sinn kamen, sind:
Effektive STL vonScott Meyers &
The C ++ Standard Library: Ein Tutorial und eine Referenz vonNicolai Josutils
quelle
Hier ist eine sehr vereinfachte Implementierung eines gefälschten Vektors, der im Grunde genommen ein Wrapper ist
std::vector
und einen eigenen (aber echten) Iterator hat, der den STL-Iterator nachahmt. Auch hier ist der Iterator sehr simpel und überspringt viele Konzepte wieconst_iterator
Gültigkeitsprüfungen usw.Code kann sofort ausgeführt werden.
quelle