2011-04-07 11 views
11

मैं सूची के सभी तत्वों के माध्यम से चल रहे लूप में पहले पुनरावृत्त तत्व तक पहुंचने का प्रयास कर रहा हूं।सी ++ सूची इटरेटर लूप में 'पिछले' तत्व का उपयोग कैसे करें?

अधिक विशिष्ट होना करने के लिए, मेरे पाश इस तरह दिखता है:

for (iter=list_object.begin(); iter!= list_object_.end(); iter++) 
    { 
    function_1(*iter); 
    function_2(*PREVIOUS_VALUE_IN_THE_LIST); 
    } 

मैं कैसे सूची में इस पिछले मान उपयोग करते हैं?

+0

बस लूप के माध्यम से पहले दौर को देखें! –

उत्तर

17

std::list केवल बोली-प्रक्रियात्मक रूप से पुन: प्रयोज्य है, इसलिए आप एक समय में केवल एक ही स्थान को स्थानांतरित कर सकते हैं।

iter_copy = iter; 
--iter; 

जाहिर है, आपको यह सुनिश्चित करना कि पिछले एक तत्व वास्तव में मौजूद है इससे पहले कि आप इटरेटर घटती के लिए जिम्मेदार हैं: आप इस तरह एक नया इटरेटर बनाना होगा।

सी ++ 0x में, यह कार्यक्षमता std::prev फ़ंक्शन में अच्छी तरह से लपेटी गई है, जो आपके सी ++ मानक लाइब्रेरी कार्यान्वयन का समर्थन कर सकता है। जैसे

template <typename BidiIt> 
BidiIt prev(BidiIt x, typename std::iterator_traits<BidiIt>::difference_type n=1) 
{ 
    std::advance(x, -n); 
    return x; 
} 
+0

बिल्कुल सही, धन्यवाद! –

2

दो संभावनाएं हैं। या तो --itor या std::advance(itor, -1)

12

एक आसान तरीका है बस पाश के लिए में पिछले तत्व का ट्रैक रखने के लिए है,: यदि नहीं, तो यह कुछ इस तरह दिखता

for(list_t::iterator iter=obj.begin(), prev=obj.end(); 
    iter != obj.end(); prev=iter, ++iter) 
{ 
    function_1(*iter); 
    if(prev != obj.end()) 
    function_2(*prev) 
} 

यह iterators हैं जो के साथ काम करेंगे बस आगे, उन्हें बिडरेक्शनल होने की आवश्यकता नहीं है।

+1

खुद ही गठबंधन! –

+0

क्या विचारशील उत्तर है। मेरे बिना बेस केस को कवर किया गया है! – nirvanaswap

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