2012-06-27 17 views
10

मैं एक सी ++ 11 कक्षा बना रहा हूं जो बड़ी मात्रा में डेटा उत्पन्न करता है। वह डेटा वर्तमान में डेटाबेस से आता है और यह पूरी तरह से स्मृति में फिट नहीं हो सकता है। मैं उपयोगकर्ता को एक इटरेटर के साथ प्रदान करना चाहता हूं जो नियमित एसटीएल इटरेटर्स की तरह व्यवहार करता है, लेकिन वह आलसी होगा। दरअसल, मैं ऐसा ही कुछ करने में सक्षम हो जाएगा:मैं अपना आलसी इटरेटर कैसे बना सकता हूं?

for (auto& item : big_bunch_of_data) { 
    do_stuff_with(item); 
} 

आइटम के साथ ही प्रत्येक यात्रा पर डेटाबेस से लिया जा रहा है। अगर मैं सही हूँ, इस नए वाक्य रचना के लिए

for (stuff::iterator it = big_bunch_of_data.begin();it != big_bunch_of_data.end();it++) { 
    do_stuff_with(*it); 
} 

चीनी यह मतलब यह है begin, end और operator++ प्रदान करके, मैं वांछित व्यवहार हो सकता है? और, इन तरीकों को क्या करना चाहिए? मेरा मतलब है, क्या मैं उन्हें सामान तोड़ने के बिना आलसी बना सकता हूं?

+1

_ "यही कारण है कि डेटा वर्तमान में डेटाबेस से आती है और यह स्मृति में पूरी तरह से फिट कर सकते हैं नहीं" _ हां, अपने डेटाबेस जानते हुए भी यह बेहतर सलाह देने के लिए मुश्किल है बिना ... लेकिन याद रखें कि कई SQL डेटाबेस में अपने स्वयं के आंतरिक इटरेटर तंत्र प्रदान _cursors_ का रूप जो आपके लिए यहां उपयोग किया जा सकता है। – Rook

+1

मैं SQLite का उपयोग कर रहा है, लेकिन यह भविष्य में बदल सकता है, और मैं अपने कोड के उपयोगकर्ताओं के लिए कच्चे संकेत बेनकाब करने के लिए नहीं करना चाहते, यही कारण है कि मैं अपनी नहीं बल्कि अच्छा संपुटित करने के लिए कोशिश कर रहा हूँ (और हाँ पहले से ही आलसी,) है एपीआई। – Fabien

उत्तर

11

लगभग; संकलक शुरू करने और अंतराल को समाप्त करने के लिए कुछ अन्य स्थानों में देखेगा यदि यह कंटेनर वर्ग पर begin या end विधियों को नहीं ढूंढ पा रहा है; यह है कि लूप के लिए रेंज-आधारित कैसे सरणी पर काम करता है, जिसमें begin और end सदस्य नहीं हैं। यह एडीएल द्वारा begin और end और अंततः std::begin और std::end के लिए मुफ्त फ़ंक्शंस की तलाश करेगा, इसलिए मौजूदा कंटेनरों को लूप समर्थन के लिए श्रेणी-आधारित रीट्रोफिट करने का बहुत अवसर है। धारा 6.5.4 विवरण शामिल हैं।

आपके अन्य प्रश्न के लिए, इटरेटर पूरी तरह से आलसी हो सकते हैं! एक अच्छा उदाहरण std::istream_iterator है जो में आलसी होने के कारण यह कंसोल से इनपुट पढ़ता है।

आवश्यकता एक for पाश में पुनरावर्तक उपयोग करने के लिए है कि यह इनपुट इटरेटर श्रेणी है, जो खंड 24.2.3 में वर्णन किया गया है को पूरा करना चाहिए; उस श्रेणी के लिए आवश्यक संचालन !=, unary *, और पूर्व-और वृद्धि-वृद्धि ++ हैं।

भाषा को यह जानने के लिए कि आपने इनपुट इटरेटर बनाया है, आपको std::iterator<std::input_iterator_tag, T, void, T *, T &> से उत्तराधिकारी होना चाहिए जहां T आपके इटरेटर सौदे (सेक्शन 24.4.3) में है।

+3

असल में, नहीं। यह सीधे '.begin() 'सदस्य फ़ंक्शंस का उपयोग करता है। और अगर ऐसी कोई सदस्यों पाए जाते हैं यह 'ADL के माध्यम से begin' का उपयोग करता है, जरूरी नहीं कि' std :: begin'। स्पष्टीकरण के लिए –

+0

@ आर। मार्टिन्होफर्नैंड्स धन्यवाद। – ecatmur

+0

ठीक है, धन्यवाद, कि मैं वास्तव में क्या जरूरत है। – Fabien

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

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