2016-07-22 11 views
1

Gibt es einen großen Unterschied zwischen const_iterator und iterator Implementierungen für std :: list außer operator* und operator->. Unten sehen Sie mein Beispiel für Hausaufgaben ohne Vorlagen, um das Wesentliche zu zeigen. Soweit ich weiß, kopieren Sie einfach die anderen Methoden für diese Klassen, wie CTOR, operator==, operator!=, operator++, operator++(int), operator--, operator--(int).const_iterator vs iterator für std :: list

class iterator 
{ 
private: 
    Node* m_node; 

public: 
    iterator(Node* node) 
     : m_node(node) 
    { 

    } 

    int& operator*() 
    { 
     return m_node->value; 
    } 

    Node* operator->() 
    { 
     return m_node; 
    } 

.... 
} 

Jetzt const iterator Implementierung

class const_iterator 
{ 
private: 
    Node* m_node; 

public: 
    const_iterator(Node* node) 
     : m_node(node) 
    { 

    } 

    int operator*() const 
    { 
     return m_node->value; 
    } 

    const Node* operator->() const 
    { 
     return m_node; 
    } 
...... 
} 

Wenn dies der wesentliche Unterschied ist, dann sollten wir die Vervielfältigung behandeln, nicht wahr?

+0

Ist Ihr Iterator in const_iterator konvertierbar? –

+0

@RichardCritten ja, ich denke es sollte sein, aber ich habe das nicht geschrieben. Es sollte 'operator const_iterator' für' iterator' geben? – Narek

+0

Ich habe 'iterator' in einigen Implementierungen von' const_iterator' abgeleitet. –

Antwort

1

Sie vermissen ein paar der unten beschriebenen Dinge, und die Klasse ist noch nicht "templatetisiert", aber der Ansatz ist der gleiche wie der, den one implementation der Standard Template Library verwendet.

  • Beide Iteratoren benötigen einen Standardkonstruktor - dies eine Möglichkeit bietet, einen Null-Iterator zu machen, die Sie später zuordnen können
  • const_iterator muss von iterator konstruierbar sein - einen Konstruktor const_iterator hinzufügen "akzeptieren regulärer "Iterator.

Soweit Code-Duplikation betroffen ist, ist dies in der Tat eine faire Beobachtung. Die meisten Implementierungen passen jedoch in eine einzige Zeile und geben unterschiedliche Typen zurück. Wenn Sie also versuchen, Implementierungen zwischen den beiden Vorlagen zu teilen, wird der Code schwerer lesbar.

+0

Wie passt eine Implementierung von 'Iterator' oder' Const_iterator' in eine einzelne Zeile? – Yakk

+0

Ich denke - "Methode" Implementierungen ist impliziert. –

+0

@Yakk Ich spreche über Implementierungen von Member-Funktionen und Operatoren (siehe Link zur Quelle, und blättern Sie bis zur "Iterator" -Implementierung). – dasblinkenlight

Verwandte Themen