2013-08-30 8 views
22

Sto provando a creare un programma che utilizza il penultimo elemento di un vettore, finora ho usato: (arr2.rbegin() + 1)Qual è il codice per il penultimo elemento in un vettore

Se uso un operatore di confronto in una tale condizione come:

if(arr2.rbegin()+1 == true) 

ricevo un messaggio di errore: 'no match for operator =='

+0

'arr2.rbegin() + 1' è un iteratore, non un valore. Prova a usare '*': 'if (* (arr2.rbegin() + 1) == true)' – JoshG79

+5

'* (arr2.rbegin() + 1)' o 'arr2 [arr2.size() - 2]' – Dave

+0

@ JoshG79: In tal caso, il tipo che si ottiene quando si annulla l'iteratore deve definire anche un operatore appropriato ==. – thokra

risposta

3

guardando la documentazione qui

http://www.cplusplus.com/reference/vector/vector/?kw=vector

mi aspetto di accedere al vostro elemento da

secondToLast = myVector[myVector.size() - 2]; 
+0

Non dovrebbe essere meno 1 invece di meno 2, visto come gli indici sono basati su zero? – Damon

+3

@Damon: No, non dovrebbe. Gli indici vanno da '0' a' size() - 1', con 'size() - 1' è l'ultimo. Quindi il penultimo è 'size() - 2'. –

1

si può provare a fare in questo modo: -

if(*(arr2.rbegin()+1)) 
0

Dipende da cosa si intende per "secondo all'ultima elemento" . Prendere la seguente definizione iteratore ...

vector<int>::iterator it = arr2.end(); 

it--; 
it--; 

Devi decriment l'iteratore due volte perché quando si dichiara l'iteratore al "punto" fino alla fine, in realtà fa riferimento alla posizione dopo l'ultimo elemento nel vettore.

Non dimenticare che quando si desidera il valore a cui punta l'iteratore, è necessario dereferenziarlo. così ...

cout << *it; 
26

Molte delle risposte e dei commenti hanno l'idea giusta ma sintassi davvero brutta. Ecco due bei modi per esprimerlo.

arr2.end()[-2] // end() is past the last element, -1 for last element, -2 for second-last 
arr2.rbegin()[1] // rbegin() is reverse order starting at 0 for last element, 1 for second-last 

Demo: http://ideone.com/2cZeUq

Funziona perché RandomAccessIterator, che ha vector è richiesto, per fornire operator[] tale che it[n] è equivalente a *(it + n), proprio come per i puntatori.

Così il codice nel tuo questione diventa solo

if (arr2.rbegin()[1]) // test penultimate element 
+0

funziona anche con 'arr2.back() [- 1]'? – Federico

+1

@Federico: no, 'front()' e 'back()' forniscono riferimenti, non iteratori. L'aritmetica del puntatore non funziona sui riferimenti. Si potrebbe fare '(& arr2.back()) [- 1]' ma è più brutto che usare gli iteratori. –

+0

Grazie per la spiegazione! :) – Federico

Problemi correlati