2010-02-28 13 views
11

Derzeit verwende ich einen Iterator, um einen Vektor zu durchsuchen und seine Elemente zu testen. Ich greife auf die Elemente mitKann ich Pointer-Arithmetik auf einem STL :: vector :: iterator verwenden

std::vector<int>::iterator it; 
if (*it == 0); 

Kann ich die gleiche Zeigerarithmetik Stil Logik verwenden, um auch das nächste Element zu testen (ohne meinen Iterator zu verändern)?

Ich muss zuerst sehen, ob es den Iterator außerhalb der Grenzen

if (it != myvec.end()) 

Dann testen Sie sowohl aktuelle Element und nächste Element

if (*it == 1 && *(it + 1) == 1) 

Wird diese Arbeit, wie ich aus mit Zeigern erwarten vorantreiben wird?

Antwort

16

Ja, die Iteratoren für std::vector sind random access iterators, also addieren/subtrahieren Sie Integralwerte, um andere gültige Iteratoren zu erhalten.

Technisch kann es Zeigerarithmetik nicht sein, aber sie fungieren genau wie Zeiger.

+0

Also, ich kann keine arithmetische Operation auf "list :: iterator", richtig? – Alcott

+1

@Alcott - richtig. Ein list :: iterator ist ein bidirektionaler Iterator und unterstützt keinen Direktzugriff. Sie können 'std :: advance' verwenden, um die Bewegung mit einem einzelnen Aufruf auszuführen, aber die Komplexität des Fortschritts ist 'O (n)' für Listen (wo es für einen Vektor' O (1) 'wäre). –

3

Dies funktioniert tatsächlich als Vektor-Iterator sind Random-Access-Iterator. Das ist nicht nur, dass Sie auf sie reagieren können, wie Sie mit Zeigern tun würden, aber sie werden ziemlich viel mit Zeiger/Zeigerarithmetik implementiert.

1

Nun, wenn Iterator auf das letzte Element des Behälters ist dann

*(it + 1) 

hat nicht definiertes Verhalten. Sie sollten prüfen, ob

it + 1 != end 

bevor es dereferencing.

+1

So ein bisschen wie mit Zeigern, müssen Sie sich selbst überprüfen, dass es nicht außerhalb der Grenzen geht. – Dom

Verwandte Themen