2010-04-20 17 views
46
#include <list> 
using std::list; 

int main() 
{ 
    list <int> n; 
    n.push_back(1); 
    n.push_back(2); 
    n.push_back(3); 

    list <int>::iterator iter = n.begin(); 
    std::advance(iter, n.size() - 1); //iter is set to last element 
} 

में अंतिम तत्व के लिए Iterator सूची में अंतिम तत्व के लिए कोई अन्य तरीका है?std :: सूची

+2

क्यों) 'n.rbegin का उपयोग नहीं ('? किसी कारण से – kennytm

+4

, मैं एक रिवर्स_इटरेटर नहीं चाहता हूं। – cpx

उत्तर

77

हां, आप अंत में एक बार वापस जा सकते हैं। (यह मानते हुए कि आप जानते हैं कि सूची खाली नहीं है।)

std::list<int>::iterator i = n.end(); 
--i; 
+0

स्थानों में इसे 'newlist.splice (- newlist.end(), पुरानी सूची में छोटा किया जा सकता है; ' – dmckee

5

end() ले लो और एक पीछे की ओर चले जाते हैं।

list <int>::iterator iter = n.end(); 
cout << *(--iter); 
+0

मुझे पीछे की ओर क्यों जाना है? क्या कोई डमी एंड नोड या कुछ है? – Tarion

+0

@Tarion: n.end() अंतिम तत्व पर इंगित नहीं करता है, लेकिन सूची के अंत से ठीक है। – ratiotile

44

निम्नलिखित में से किसी list में अंतिम आइटम के लिए एक std::list<int>::iterator वापस आ जाएगी:

std::list<int>::iterator iter = n.end(); 
--iter; 

std::list<int>::iterator iter = n.end(); 
std::advance(iter, -1); 

// C++11 
std::list<int>::iterator iter = std::next(n.end(), -1); 

// C++11 
std::list<int>::iterator iter = std::prev(n.end()); 

निम्नलिखित list में अंतिम आइटम के लिए एक std::list<int>::reverse_iterator वापस आ जाएगी:

std::list<int>::reverse_iterator iter = std::list::rbegin(); 
+37

'बैक()' अंतिम तत्व का संदर्भ देता है, अंतिम तत्व के लिए पुनरावर्तक नहीं; 'rbegin() 'एक रिवर्स इटेटरेटर देता है, न कि एक इटेटरेटर। –

+6

एक रिवर्स इटेटरेटर एक इटरेटर है। यह सिर्फ एक सूची :: iterator नहीं है। –

+0

@ डेनिस: मेरा मतलब क्या है; क्षमा करें अगर यह स्पष्ट नहीं था। –

6

रिवर्स iterators के साथ:

iter = (++n.rbegin()).base() 

एक तरफ ध्यान दें के रूप में: इस या चार्ल्स बेली विधि है निरंतर जटिलता जबकि std::advance(iter, n.size() - 1); में सूची के साथ रैखिक जटिलता है [क्योंकि इसमें बिडरेक्शनल इटरेटर हैं]।

+0

क्यों "+ + एन। रेबेजिन() "? मेरे लिए जो पिछले तत्व के बगल में एक रिवर्स इटरेटर की तरह लगता है। "N.rbegin() आधार()" ("++" के बिना) अंतिम तत्व के लिए पुनरावर्तक नहीं होगा? – zentrunix

+0

@ जोसेक्स। आधार() एक रिवर्स इटरेटर को आगे के पुनरावर्तक में कास्टिंग करने के लिए सिर्फ शॉर्टेंड नहीं है। आधार के बारे में अधिक जानकारी के लिए इस प्रतिक्रिया पर नज़र डालें: http://stackoverflow.com/a/16609146/153861 –

1

आप दिए गए एक से पिछला (और अगला) इटेटरेटर प्राप्त करने के लिए अपने स्वयं के फ़ंक्शन लिख सकते हैं (जिसे मैंने "पीछे-पीछे" और "देखो-आगे" की आवश्यकता है std::list):

template <class Iter> 
Iter previous(Iter it) 
{ 
    return --it; 
} 

और फिर:

std::list<X>::iterator last = previous(li.end()); 

BTW, यह भी बढ़ावा पुस्तकालय (next and prior) में उपलब्ध हो सकता है।

+5

यह सी ++ 0x में भी उपलब्ध है ('std :: next' और' std :: prev')। –

0
list<int>n; 
list<int>::reverse_iterator it; 
int j; 

for(j=1,it=n.rbegin();j<2;j++,it++) 
cout<<*it; 
+3

आपके द्वारा पोस्ट किए गए कोड को समझाते हुए आपका उत्तर और भी बेहतर होगा। –

संबंधित मुद्दे