2010-02-28 11 views
11

Attualmente utilizzo un iteratore per cercare attraverso un vettore e testarne gli elementi. Accedo gli elementi utilizzandoPosso eseguire aritmetica del puntatore su un STL :: vector :: iterator

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

Posso usare la stessa logica stile aritmetica dei puntatori per testare anche l'elemento successivo (senza alterare il mio iterator)?

ho bisogno di vedere se spingerà l'iteratore fuori limite

if (it != myvec.end()) 

Poi prova sia elemento corrente e successivo elemento

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

Sarà questo lavoro mi aspetto di utilizzare puntatori?

risposta

16

Sì, gli iteratori per std::vector sono random access iterators in modo da aggiungere/sottrarre valori interi per ottenere altri iteratori validi.

Tecnicamente, potrebbe non essere l'aritmetica del puntatore, ma agiscono proprio come i puntatori.

+0

Quindi, non posso eseguire operazioni aritmetiche su 'list :: iterator', giusto? – Alcott

+1

@Alcott - corretto. Un list :: iterator è un iteratore bidirezionale e non supporta l'accesso casuale. Puoi usare 'std :: advance' per fare lo spostamento con una singola chiamata, ma la complessità dell'avanzamento è' O (n) 'per le liste (dove sarebbe' O (1) 'per un vettore). –

3

Ciò funzionerà effettivamente come iteratore di vettore è iteratore di accesso casuale. Questo non solo puoi agire su di loro come faresti con i puntatori, ma sono praticamente implementati usando puntatori/aritmetica dei puntatori.

1

comportamento Beh, se iteratore è l'ultimo elemento del contenitore poi

*(it + 1) 

è indefinito. Si dovrebbe verificare che

it + 1 != end 

prima dereferencing esso.

+1

Quindi, un po 'come usare i puntatori, devi controllare che non vada fuori limite. – Dom