2013-08-30 18 views
22

Bir vektörde ikinci ve son öğeyi kullanan bir program oluşturmaya çalışıyorum, şu ana kadar kullandım: (arr2.rbegin() + 1) Ben gibi bir koşullu böyle bir karşılaştırma operatörü kullanıyorsanızBir vektördeki ikinci sonuncu öğenin kodu nedir

:

+0

'arr2.rbegin() + 1 'bir yineleyici değil, bir değerdir olur. '*': 'If (* (arr2.rbegin() + 1) == true)' – JoshG79

+5

'* (arr2.rbegin() + 1)' veya 'arr2 [arr2.size() - 2]' yi kullanmayı deneyin. – Dave

+0

@ JoshG79: Bu durumda, yineleyiciyi iptal ederken elde ettiğiniz türün uygun bir operatör tanımlaması gerekir ==. – thokra

cevap

3

'no match for operator ==' burada belgelerine

görünümlü:

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

bir hata mesajı almak

Sana

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

Bu eksi 2 yerine eksi 1 değil, endekslerin sıfır temelli olduğunu görmeli midir? – Damon

+3

@Damon: Hayır, yapmamalı. Endeksler '0 'dan' size() - 1' 'e, 'size() - 1' sonuncu ile çalışır. Bu nedenle, en sonuncu, boyutudur() - 2'dir. –

1

Böyle yaparak deneyin edebilir ederek eleman erişmek için beklediğiniz: -

O "ikinci son öğeye" kastın ne olduğuna bağlıdır
if(*(arr2.rbegin()+1)) 
0

. Sen sonuna kadar "nokta" için yineleyiciyi ilan zaman çünkü iki kez yineleyici decriment zorunda ...

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

it--; 
it--; 

aşağıdaki yineleyici tanımını almak, aslında vektör son öğe SONRA yerini başvurur.

Yineleyicinin işaret ettiği değeri istediğinizde bunu belirtmeniz gerektiğini unutmayın. öyleyse ...

cout << *it; 
26

Cevapların ve yorumların çoğu doğru fikre sahip, ancak gerçekten çirkin sözdizimine sahip. Bunu ifade etmenin iki yolu var.

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

gereklidir etti vector RandomAccessIterator, it[n] sadece işaretçileri için olduğu gibi, *(it + n) eşdeğerdir operator[] şekilde temin etmek çünkü çalışır.

Yani söz konusu kod sadece

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

bu da arr2.back() [- 1] 'ile çalışır mı? – Federico

+1

@Federico: hayır, 'front()' ve 'back()' yineleyicileri değil, referanslar verir. İşaretçi aritmetiği referanslarda çalışmaz. Yapabilirdiniz (& arr2.back()) [- 1] 'ancak yineleyicileri kullanmaktan daha çirkin. –

+0

Açıklama için teşekkürler! :) – Federico

İlgili konular