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
:
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
:
'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];
Bu eksi 2 yerine eksi 1 değil, endekslerin sıfır temelli olduğunu görmeli midir? – Damon
@Damon: Hayır, yapmamalı. Endeksler '0 'dan' size() - 1' 'e, 'size() - 1' sonuncu ile çalışır. Bu nedenle, en sonuncu, boyutudur() - 2'dir. –
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ırif(*(arr2.rbegin()+1))
. 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;
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
bu da arr2.back() [- 1] 'ile çalışır mı? – Federico
@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. –
Açıklama için teşekkürler! :) – Federico
'arr2.rbegin() + 1 'bir yineleyici değil, bir değerdir olur. '*': 'If (* (arr2.rbegin() + 1) == true)' – JoshG79
'* (arr2.rbegin() + 1)' veya 'arr2 [arr2.size() - 2]' yi kullanmayı deneyin. – Dave
@ JoshG79: Bu durumda, yineleyiciyi iptal ederken elde ettiğiniz türün uygun bir operatör tanımlaması gerekir ==. – thokra