it-swarm.com.de

Was ist der Unterschied zwischen const_iterator und iterator?

Was ist der Unterschied zwischen diesen beiden in Bezug auf die Implementierung in AWL. Was ist der Unterschied in Bezug auf die Leistung? Ich schätze, wenn wir den Vektor "nur lesbar" durchlaufen, bevorzugen wir const_iterator, Recht?

Vielen Dank.

119
user658266

Es gibt keinen Leistungsunterschied.

EIN const_iterator ist ein Iterator, der auf einen konstanten Wert zeigt (wie ein const T* Zeiger); Dereferenzierung gibt einen Verweis auf einen konstanten Wert zurück (const T&) und verhindert die Änderung des referenzierten Werts: Erzwingt const- Korrektheit .

Wenn Sie einen konstanten Verweis auf den Container haben, können Sie nur ein const_iterator.

Bearbeitet: Ich erwähnte “The const_iterator gibt konstante Zeiger zurück “, was nicht korrekt ist, dank Brandon, der darauf hingewiesen hat.

Bearbeiten: Bei COW-Objekten wird die Kopie wahrscheinlich ausgelöst, wenn ein Nicht-Konstanten-Iterator abgerufen (oder dereferenziert) wird. (Einige veraltete und jetzt nicht mehr zugelassene Implementierungen von std::string COW verwenden.)

118
ysdx

Leistungstechnisch gibt es keinen Unterschied. Der einzige Zweck von const_iterator über iterator verwaltet die Zugänglichkeit des Containers, auf dem der jeweilige Iterator ausgeführt wird. Sie können es anhand eines Beispiels besser verstehen:

std::vector<int> integers{ 3, 4, 56, 6, 778 };

Wenn wir die Mitglieder eines Containers lesen und schreiben würden, würden wir den Iterator verwenden:

for( std::vector<int>::iterator it = integers.begin() ; it != integers.end() ; ++it )
       {*it = 4;  std::cout << *it << std::endl; }

Wenn wir nur die Mitglieder des Containers integers lesen würden, könnten Sie const_iterator verwenden, der es nicht erlaubt, Mitglieder des Containers zu schreiben oder zu ändern.

for( std::vector<int>::const_iterator it = integers.begin() ; it != integers.end() ; ++it )
       { cout << *it << endl; }

HINWEIS: Wenn Sie versuchen, den Inhalt mithilfe von * it zu ändern, wird im zweiten Fall ein Fehler angezeigt, da er schreibgeschützt ist.

37
AbhimanyuAryan

wenn du eine liste hast a und dann folgende aussagen

list<int>::iterator it; // declare an iterator
    list<int>::const_iterator cit; // declare an const iterator 
    it=a.begin();
    cit=a.begin();

sie können den Inhalt des Elements in der Liste mit "it", aber nicht mit "cit" ändern, dh Sie können "cit" zum Lesen des Inhalts verwenden, nicht zum Aktualisieren der Elemente.

*it=*it+1;//returns no error
    *cit=*cit+1;//this will return error
6
Seenivasan