Ich dachte, ich würde meinen eigenen kleinen Ratschlag hinzufügen.
Als erstes möchte ich bemerken, dass iterator
und const_iterator
sehr wahrscheinlich einen Großteil ihrer Implementierung gemeinsam haben. Obwohl der Code ähnlich ist, ist er nicht exakt identisch. Dies bittet um Vorlagen.
Die zweite Sache, die ich gerne beachten würde ist, dass eine const_iterator
(iterator
) (implizit) konstruierbar sein sollte, aber nicht umgekehrt.
Die dritte Sache, die ich gerne beachten möchte, ist, dass, wenn Sie eine map
-ähnliche Schnittstelle haben möchten, dann müssen Sie auch eine reverse_iterator
und const_reverse_iterator
bereitstellen.
Aus der Sicht des Stils, tendiere ich nicht, die Implementierung der iterator
selbst in der Klasse zu setzen. Ich finde es nicht lesbar, wenn die Klassenimplementierung mit so viel Code vollgestopft ist, dass man Mühe hat, die verfügbaren Typen und Methoden zu sehen. Aus diesem Grund würde ich empfehlen, die Implementierung außerhalb der Klasse zu platzieren.
Endlich, ich empfehle definitiv Boost.Iterator. Sie dürfen es nicht benutzen, aber lesen Sie das Material, es wird Ihnen vor allem Einblick geben, wie Sie den Code einmal schreiben und für die 4 Arten verwenden!
Schnell Illustration:
namespace detail {
template <class Value> class base_iterator;
}
template <class Value>
class container
{
public:
typedef detail::base_iterator<Value> iterator;
typedef detail::base_iterator<Value const> const_iterator;
typedef boost::reverse_iterator<iterator> reverse_iterator;
typedef boost::reverse_iterator<const_iterator> const_reverse_iterator;
};
Ich weiß nicht, über Sie, aber ich fühle mich gut, wenn ich nur ein Viertel der Arbeit zu tun und nutzt einen Compiler/Bibliothek in den Rest für mich zu füllen :)
Zu Ihrer Information, basieren die meisten STL-Implementierungen ihre std :: map auf einem rot-schwarzen Baum, also sollten Sie std :: map verwenden, wenn Sie dies nicht aus pädagogischen Gründen tun. –