2013-08-30 11 views
22

में दूसरे तत्व के लिए कोड का कोड क्या है, मैं एक ऐसा प्रोग्राम बनाने की कोशिश कर रहा हूं जो एक वेक्टर में अंतिम तत्व के लिए दूसरे का उपयोग करता है, अब तक मैंने उपयोग किया है: (arr2.rbegin() + 1)वेक्टर

अगर मैं के रूप में एक सशर्त ऐसे में एक तुलना ऑपरेटर का उपयोग करें: 'no match for operator =='

+0

'arr2.rbegin() + 1' पुनरावर्तक, नहीं एक मूल्य है। '*' का उपयोग करने का प्रयास करें: 'अगर (* (arr2.rbegin() + 1) == सत्य) ' – JoshG79

+5

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

+0

@ जोशजी 7 9: उस स्थिति में, इटरेटर को डिफ्रेंस करने पर आपको प्राप्त होने वाले प्रकार को उपयुक्त ऑपरेटर == को परिभाषित करने की आवश्यकता होती है। – thokra

उत्तर

3

प्रलेखन पर यहाँ

देख:

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

मैं एक त्रुटि संदेश मिलता

मैं तुम्हें द्वारा

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

यह शून्य से 2 के बजाय शून्य 1 नहीं होना चाहिए, यह देखते हुए कि सूचकांक शून्य-आधारित कैसे हैं? – Damon

+3

@ डैमन: नहीं, यह नहीं होना चाहिए। इंडेक्स '0' से 'आकार() - 1' तक चलते हैं, जिसमें आकार() - 1' अंतिम होता है। इसलिए अगली-टू-आखिरी 'आकार() - 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

@ फेडेरिको: नहीं, 'फ्रंट()' और 'बैक()' संदर्भ दें, न कि इटरेटर। सूचक अंकगणित संदर्भों पर काम नहीं करता है। आप '(& arr2.back()) [- 1] 'कर सकते हैं, लेकिन यह इटरेटर का उपयोग करने से अधिक है। –

+0

स्पष्टीकरण के लिए धन्यवाद! :) – Federico