2013-03-04 13 views
15

Sto lavorando a un esercizio in cui ho un vettore e sto scrivendo il mio algoritmo di inversione utilizzando un reverse e un normale iteratore (avanti) per invertire il contenuto di il vettore. Tuttavia, non sono in grado di confrontare gli iteratori.Confronta vettore <T> :: iteratore con vettore <T> :: reverse_iterator

int vals[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; 
vector<int> numbers(vals, vals + 10); 

vector<int>::iterator  start = numbers.begin(); 
vector<int>::reverse_iterator end = numbers.rend(); 

Ho un algoritmo precedente per invertire il vettore utilizzando due iteratori, tuttavia in questo compito non sono in grado di confrontarli con il! = Operatore tra loro. La mia ipotesi sarebbe quella di ottenere i puntatori o gli indici sottostanti nel vettore l'uno con l'altro, ma come ottengo i puntatori/indice?

+0

Per l'esercizio, sarebbe più semplice utilizzare due iteratori in avanti: 'for (vettore :: iteratore i = numbers.begin(), j = numbers.end(); i

risposta

13

Eseguire un confronto utilizzando l'iteratore restituito da base(): it == rit.base() - 1.

+2

Stai attento, però. Se 'rit' è un iteratore finale (vale a dire la fine dell'iterazione inversa), quindi' rit.base() 'è' numbers.begin() 'ed è UB a sottrarre 1 da esso. Un'alternativa è confrontare 'distance (numbers.begin(), it) == distance (rit, numbers.rend()) - 1'. –

+0

Grazie :) Ecco il risultato del mio esercizio: http://pastebin.com/mEv2uJ2F – Martin

+1

@SteveJessop: e, naturalmente, c'è anche il problema che '- 1' non può essere applicato a BidirectionalIterators in generale ma solo a RandomAccessIterators , quindi il codice fornito da @wilx non funziona per 'list'. –

4

È possibile convertire un reverse_iterator in iterator chiamando il numero base().

Attenzione, poiché sono presenti alcuni avvertimenti. Il commento di @Matthieu M. è particolarmente utile:

Nota: base() in realtà restituisce una iterator all'elemento seguente l'elemento che il reverse_iterator stava indicando.

+4

Nota:' base() 'restituisce effettivamente un' iteratore' all'elemento * che segue * l'elemento a cui stava puntando 'reverse_iterator'. –

+0

@ Matthieu M .: Sì, questo è l'avvertimento principale di cui stavo per scrivere - ma ora che lo hai già fatto, non credo di doverlo più fare. Grazie! – Reunanen

+0

@TobySpeight: hai ragione, così ora ho fatto esattamente questo. – Reunanen

0

È possibile utilizzare (&*start == &*(end - 1)) per confrontare direttamente l'indirizzo a cui punta l'iteratore.

+2

Puoi ... ma dovresti? :) – BartoszKP

+0

Questo non risponde alla domanda. L'OP ha chiesto come confrontare un iteratore con un reverse_iterator, non come confrontare gli indirizzi degli elementi start e end-1. – RichS

Problemi correlati