2013-02-25 75 views
5

मैंने एक कक्षा लिखी है जो सीएसवी प्रारूपित फ़ाइलों को पार्स करने के लिए एक इटरेटर की तरह कार्य करता है। मैंने सीधे एक MyObject संरचना को भरने के लिए विशिष्ट सीएसवी फ़ाइलों को पढ़ने के लिए अन्य कक्षाएं भी लिखी हैं।क्या स्वरूपित स्ट्रीम पर पढ़ने के लिए इटरेटर का उपयोग करना एक अच्छी बात है?

std::ifstream in(filename); 
MyObjectParser parser(in); 
MyObjectParser::Iterator it; 
for (it = parser.begin(); it != parser.end(); it++) 
{ 
    MyObject b = *it; 
    // do some stuff here ... 
} 

कार्यक्रम अच्छी तरह से काम करता है और मैं इसके साथ खुश हूँ, लेकिन मुझे लगता है कि निहित अर्थ (केवल खुद के लिए महसूस किया: इस प्रकार वर्ग की तरह है कि (मैं कोड का हिस्सा निपटने त्रुटि हटाया) का इस्तेमाल किया जा सकता है?) एक इटरेटर का है कि यह संग्रह पर पुन: सक्रिय होगा। इस मामले में कोई संग्रह नहीं है लेकिन एक धारा है।

std::ifstream in(filename); 
MyObjectReader reader(in); 
MyObject obj; 
while(reader >> obj) 
{ 
    // do the same "some stuff" here... 
} 

यह स्वाद का केवल एक बात है:

मैं एक रूप को स्पष्ट रूप से अधिक भार से >> ऑपरेटर मैं एक धारा का उपयोग कर रहा सुझाव है कि और ऐसा ही कुछ इस प्रकार हो रही पसंद करते हैं चाहिए? मैं स्पष्ट रूप से नहीं देखता कि मतभेद क्या हैं (सिवाय इसके कि दूसरे रूप में ऑब्जेक्ट अभी भर चुका है और प्रतिलिपि नहीं है) और पहले या दूसरे रूप को चुनने के क्या परिणाम हैं।

मुझे यह जानने के लिए कुछ अन्य राय मिलकर खुशी होगी कि मैं दूसरे के बजाय समाधान का उपयोग क्यों कर रहा हूं।

+0

कौन कहता है कि इटेटर को * संग्रह * पर फिर से चालू होना चाहिए? मेरी समझ यह है कि इटेटरेटर्स * कुछ * पर * * कुछ * ** किसी भी प्रकार का डेटा **, उदाहरण के लिए एक कंटेनर, एक स्ट्रीम (फ़ाइल, नेटवर्क डेटा, ...) या यहां तक ​​कि कुछ अंतर्निहित (शायद डमी) डेटा। इसे सामान्य रखें। ;) मैं व्यक्तिगत रूप से आपके इटरेटर-आधारित इंटरफ़ेस को पसंद करता हूं। – leemes

उत्तर

6

यदि आप चाहें तो स्ट्रीम को एक संग्रह के रूप में देख सकते हैं।

मैं ध्यान दें चाहते हैं, हालांकि, operator>> अधिक भार से, आप दोनों हो सकता है - आप स्पष्ट रूप से धारा से डेटा सीधे operator>> का उपयोग कर, std::istream_iterator<whatever> का उपयोग कर इलाज के लिए से पढ़ सकते हैं या आप एक संग्रह के रूप में धारा इलाज कर सकते हैं यह एक संग्रह के रूप में।

यह मामला है, ऐसा लगता है कि operator>> ओवरलोडिंग स्पष्ट विकल्प है, तब से आप अनिवार्य रूप से कोई अतिरिक्त काम नहीं कर सकते हैं। इसके अलावा, std::istream_iterator<x> का उपयोग एक काफी पहचानने योग्य मुहावरे है, क्योंकि यह मानक पुस्तकालय में शामिल है।

2

पुनरावृत्ति की अवधारणा कंटेनरों पर निर्भर नहीं है। इटरेटर मूल्यों के अनुक्रम पर पुनरावृत्त होते हैं। विभिन्न इटरेटर डिज़ाइन अनुक्रम को विभिन्न तरीकों से परिभाषित करते हैं, लेकिन हमेशा वर्तमान मूल्य, अग्रिम और अंत तक पहुंचने के विचार हैं। इनपुट इटरेटर्स के साथ एकमात्र समस्या यह है कि वे फ़ाइल के अंत में केवल समाप्त हो जाते हैं; आप यह नहीं कह सकते हैं, उदाहरण के लिए, अगली 10 पंक्तियों में युगल होता है, और फिर हम पर कुछ और जाते हैं। (लेकिन निश्चित रूप से, आप अंत में पता लगाने के लिए स्ट्रीम में स्ट्रीमबफ फ़िल्टर कर सकते हैं।)