2012-04-13 10 views
40

कहें कि मेरे पास सूची के माध्यम से std::list<int> lst और कुछ std::list<int>::iterator it है। और it के मान पर निर्भर करता है, मैं अपने कोड में it + 1 या it - 1 का उपयोग करना चाहता हूं। क्या ऐसा करने के लिए कुछ अच्छा तरीका है next(), prev() (मुझे एसएलएल दस्तावेज में ऐसी चीजें नहीं मिलीं)? या क्या मुझे प्रत्येक बार it कॉपी करना चाहिए और प्रतिलिपि (कमी) प्रतिलिपि बनाना चाहिए?std :: सूची में अगले (पिछले) तत्व को बिना वृद्धि (घटाने) इटेटरेटर के बिना कैसे प्राप्त करें?

+0

जब आप इसे '++' करते हैं, तो यह 'it = it + 1' के रूप में अनुवाद करता है, जिसका अर्थ तकनीकी रूप से है इटेटरेटर ऑब्जेक्ट हर समय एक नई ऑब्जेक्ट भी हो सकता है। सुनिश्चित नहीं है कि आप क्या पूछ रहे हैं। – Neil

+3

प्रतिलिपि बनाना और बढ़ाना/प्रतिलिपि बनाना एकमात्र तरीका है। इसे छिपाने के लिए आप रैपर फ़ंक्शन लिख सकते हैं (और जैसा कि उल्लेख किया गया है उत्तर, सी ++ 11 में 'std :: prev' /' std :: next' है जो सिर्फ यही करता है। लेकिन वे इस "प्रतिलिपि और वृद्धि" ऑपरेशन के आसपास रैपर हैं – jalf

+0

धन्यवाद @jalf। आपका उत्तर एकमात्र पूर्ण उत्तर है। –

उत्तर

17

कॉपी करने और बढ़ाने/कॉपी decrementing एक ही तरीका है यह किया जा सकता है।

आप इसे छिपाने के लिए रैपर फ़ंक्शंस लिख सकते हैं (और जैसा कि उत्तर में बताया गया है, सी ++ 11 में std :: prev/std :: है जो अगला है (और बूस्ट समान कार्यों को परिभाषित करता है)। लेकिन वे चारों ओर रैपर हैं यह "प्रतिलिपि और वृद्धि" ऑपरेशन है, इसलिए आपको चिंता करने की ज़रूरत नहीं है कि आप इसे "गलत" कर रहे हैं।

5

prior और nextBoost.utility से एक साधारण पूर्व निर्धारित समाधान है। वे operator-- और operator++ का लाभ उठाते हैं लेकिन आपको अस्थायी बनाने की आवश्यकता नहीं है।

+2

बेशक यह उल्लेख किया जाना चाहिए कि 1. वे अपने आप पर अस्थायी बनाते हैं और 2. आप बेहतर सीमा परिस्थितियों से अवगत रहेंगे। –

39

हां, चूंकि सी ++ 11 में दो विधियां हैं जिन्हें आप std::prev और std::next कहलाते हैं। आप उन्हें इटरेटर लाइब्रेरी में पा सकते हैं।

cppreference.com से उदाहरण

#include <iostream> 
#include <iterator> 
#include <vector> 

int main() 
{ 
    std::list<int> v{ 3, 1, 4 }; 

    auto it = v.begin(); 

    auto nx = std::next(it, 2); 

    std::cout << *it << ' ' << *nx << '\n'; 
} 

आउटपुट:

3 4 
+4

और निश्चित रूप से, यदि आपके पास C++ 11 नहीं है, तो उन्हें लागू करना बहुत आसान है। (मुझे लगता है कि उनमें से अधिकतर उन्हें हमारे टूलकिट्स में अच्छी तरह से थे, इससे पहले कि उन्हें सी ++ 11 के लिए भी प्रस्तावित किया गया था।) –

+0

जिसने चाल बनाई –