2013-08-30 63 views
22

我想構建一個使用向量中第二個到最後一個元素的程序,到目前爲止我已經使用了:(arr2.rbegin()+ 1)什麼是向量中第二個到最後一個元素的代碼

如果我用一個比較操作的條件,如:

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

我得到一個錯誤信息:'no match for operator =='

+0

'arr2.rbegin()+ 1'是一個迭代器,而不是一個值。嘗試使用'*':'if(*(arr2.rbegin()+ 1)== true)' – JoshG79

+5

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

+0

@ JoshG79:在這種情況下,取消引用迭代器時得到的類型也需要定義合適的運算符==。 – thokra

回答

3

看文檔這裏

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

我希望你通過

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

不應該是減1而不是減2,看看指數是如何基於零的? – Damon

+3

@Damon:不,它不應該。索引從'0'運行到'size() - 1','size() - 1'是最後一個。因此,倒數第二個是「size() - 2」。 –

1

你可以嘗試做這樣的訪問你的元素: -

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

它通過取決於你的意思是「倒數第二個元素」 。看看下面的迭代器定義...

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

it--; 
it--; 

你,因爲當你聲明迭代器「點」到最後decriment迭代器的兩倍,它實際上引用位置向量中的最後一個元素之後。

不要忘記,當你想要迭代器指向的值時,你必須對其進行解引用。像這樣...

cout << *it; 
26

許多答案和評論有正確的想法,但真正醜陋的語法。以下是兩種很好的表達方式。

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 

演示:http://ideone.com/2cZeUq

它的工作原理,因爲RandomAccessIterator的,這vector已,需要提供operator[]這樣it[n]相當於*(it + n),就像爲指針。

所以你的問題的代碼變得只是

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

這個工作也可以用'arr2.back()[ - 1]'? – Federico

+1

@Federico:no,'front()'和'back()'給出引用,而不是迭代器。指針運算不適用於參考。你可以做'(&arr2.back())[ - 1]',但這比使用迭代器更醜陋。 –

+0

感謝您的解釋! :) – Federico

相關問題