2013-08-30 14 views
22

Próbuję zbudować program, który używa od drugiego do ostatniego elementu w wektorze, do tej pory użyłem: (arr2.rbegin() + 1)Jaki jest kod od drugiego do ostatniego elementu w wektorze

Jeśli używam operator porównania w warunkowe takie jak:

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

otrzymuję komunikat o błędzie: 'no match for operator =='

+0

'arr2.rbegin() + 1 'jest iterator, a nie wartość. Spróbuj użyć '*': 'if (* (arr2.rbegin() + 1) == true)' – JoshG79

+5

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

+0

@ JoshG79: W takim przypadku typ, który otrzymasz, gdy odwołasz się do iteratora, musi również zdefiniować odpowiedniego operatora ==. – thokra

Odpowiedz

3

patrząc na dokumentacji tutaj

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

będę oczekiwać, aby uzyskać dostęp do elementu przez

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

Czy nie powinno to być minus 1 zamiast minus 2, sprawdzając, jak indeksy są oparte na zera? – Damon

+3

@Damon: Nie, nie powinien. Indeksy zaczynają się od '0' do' size() - 1', a "size() - 1" jest ostatnim. Dlatego następny do ostatniego to "size() - 2". –

1

Można spróbować zrobić tak: -

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

To zależy co masz na myśli przez „drugi do ostatniego elementu” . Przyjąć następującą definicję iterator ...

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

it--; 
it--; 

Trzeba decriment iteracyjnej dwukrotnie bo kiedy zadeklarować iterator do „punkt” do końca, to faktycznie odwołuje lokalizację PO ostatniego elementu w wektorze.

Nie zapominaj, że gdy chcesz uzyskać wartość, którą wskazuje iterator, musisz ją usunąć. tak jak ...

cout << *it; 
26

Wiele odpowiedzi i komentarzy ma dobry pomysł, ale naprawdę brzydka składnia. Oto dwa miłe sposoby na wyrażenie tego.

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

To działa, ponieważ RandomAccessIterator, który vector ma, wymagane jest dostarczenie operator[] takie, że it[n] jest równoważna *(it + n), podobnie jak dla wskaźników.

Więc kod w swoim pytaniu staje się właśnie

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

czy to też działa z 'arr2.back() [- 1]'? – Federico

+1

@Federico: nie, 'front()' i 'back()' dają odniesienia, a nie iteratory. Arytmetyka wskaźnikowa nie działa w przypadku odniesień. Możesz zrobić '(& arr2.back()) [- 1]' ale jest to brzydsze niż użycie iteratorów. –

+0

Dzięki za wyjaśnienie! :) – Federico

Powiązane problemy