2011-02-08 10 views
6

के साथ प्रतिस्थापित करने के लिए तरीका तो मैं जीसीसी 4.6 का उपयोग कर नए सी ++ में शामिल हो रहा हूं, जिसमें अब रेंज-आधारित-लूप हैं। मुझे यह सरणी और वैक्टरों पर फिर से चलने के लिए वास्तव में अच्छा लगा है।सी ++ 0x रास्ता (int i ;;) रेंज लूप के लिए रेंज-आधारित-लूप

मुख्य रूप से सौंदर्य कारणों मैंने सोचा अगर वहाँ इस का उपयोग करने की तरह

for(int& i : std::range(min, max)) {}

कुछ के साथ मानक

for(int i = min; i < max; i++) {}

को बदलने के लिए एक तरीका था के लिए वहाँ कुछ देशी रूप में बनाया गया है नया सी ++ मानक जो मुझे ऐसा करने की अनुमति देता है? या मुझे अपनी खुद की रेंज/इटरेटर कक्षा लिखनी है?

+0

डुप्लिकेट: http://stackoverflow.com/questions/1977339/c-range-xrange-equivalent-in-stl-or-boost – AFoglia

+0

संभावित डुप्लिकेट [क्या सी ++ 11 में उपयोग के लिए एक श्रेणी कक्षा है लूप के लिए आधारित श्रेणी?] (http://stackoverflow.com/questions/7185437/is-there-a-range-class-in-c11-for-use-with-range-based-for-loops) –

उत्तर

4

मुझे इसे कहीं भी नहीं देखा जाता है। लेकिन यह नहीं बल्कि तुच्छ होगा:

class range_iterator : public std::input_iterator<int, int> { 
    int x; 
public: 
    range_iterator() {} 
    range_iterator(int x) : x(x) {} 
    range_iterator &operator++() { ++x; return *this; } 
    bool operator==(const range_iterator &r) const { return x == r.x; } 
    int operator*() const { return x; } 
}; 
std::pair<range_iterator, range_iterator> range(int a, int b) { 
    return std::make_pair(range_iterator(a), range_iterator(b)); 
} 

चाल करना चाहिए (मेरे सिर के ऊपर से, एक छोटे से फेरबदल की आवश्यकता हो सकती)। इटरेटर्स की जोड़ी पहले ही सीमा होनी चाहिए, इसलिए मेरा मानना ​​है कि आपको खुद को परिभाषित करने और समाप्त करने की आवश्यकता नहीं है।

+0

आप शायद साथ ही इसे 'इंटेगर' प्रकार पर टेम्पलेट बनाएं। –

+0

@Matthieu हाँ, यकीन है। ऊपर दिए गए डुप्लिकेट के रूप में वर्णित अन्य प्रश्न में कुछ और उन्नत कार्यान्वयन हैं। –

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