2012-08-14 17 views
8

में एल्गोरिदम, iterators और कंटेनरों की एक जुदाई मैं समझ नहीं क्यों वे सी ++ एसटीएल में एल्गोरिदम, iterators और कंटेनरों अलग कर दिया है। यदि यह हर जगह टेम्पलेट्स का भारी उपयोग है, तो हमारे पास टेम्पलेट पैरामीटर के साथ एक ही स्थान पर सभी सामान रखने वाले वर्ग हो सकते हैं।क्यों सी ++ एसटीएल

कुछ पाठ कि मुझे मिल गया बताते हैं कि iterators एल्गोरिदम में मदद करता है कंटेनरों डेटा के साथ बातचीत करने लेकिन क्या हुआ अगर कंटेनर डेटा यह पास तक पहुँचने के लिए कुछ तंत्र का पर्दाफाश?

+1

मुझे आपके द्वारा लिखे गए एक शब्द को समझ में नहीं आया। :( – Mehrdad

+0

ठीक है खेद भ्रम का कारण के लिए, मैं क्या मतलब है कि हम कंटेनरों के लिए विभिन्न वर्गों है, iterators आदि मैं अगर हम टेम्पलेट का उपयोग कर एक कक्षा में सभी डाल क्या गलत है आंकड़ा करना चाहते हैं, कंटेनर डेटा है और वे देखने के लिए कुछ इंटरफेस का खुलासा कर सकते हैं यह या संशोधित करते हैं। यही कारण है कि वे अलग कर रहे हैं? मेरा मतलब है क्यों वहाँ विभिन्न iterators हैं, एल्गोरिदम आदि – Rahul

+3

[यह सवाल] (http://stackoverflow.com/questions/10380612/principles-behind-stl-design) कुछ तुम दे सकता है संकेत दिए गए। [यह साक्षात्कार] (http://www.sgi.com/tech/stl/drdobbs-interview.html) एलेक्स Stephanov, एसटीएल के निर्माता, के साथ भी कुछ ऐसी जानकारियां दी हैं। –

उत्तर

22
M कंटेनर + N एल्गोरिदम के साथ

, एक सामान्य रूप से कोड की M * N टुकड़े की आवश्यकता होगी, लेकिन "गोंद" के रूप में अभिनय iterators के साथ, इस कोड के M + N टुकड़े को कम किया जा सकता है।

उदाहरण: रन 3 कंटेनरों

std::list<int> l = { 0, 2, 5, 6, 3, 1 }; // C++11 initializer lists 
std::vector<int> v = { 0, 2, 5, 6, 3, 1 }; // C++11 initializer lists 
std::array<int, 5> a = { 0, 2, 5, 6, 3, 1 }; 

auto l_contains1 = std::find(l.begin(), l.end(), 1) != l.end(); 
auto v_contains5 = std::find(v.begin(), v.end(), 5) != v.end(); 
auto a_contains3 = std::find(a.begin(), a.end(), 3) != a.end(); 

auto l_count1 = std::count(l.begin(), l.end(), 1); 
auto v_count5 = std::count(v.begin(), v.end(), 5); 
auto a_count3 = std::count(a.begin(), a.end(), 3); 

आप केवल 2 अलग एल्गोरिदम बुला रहे हैं पर 2 एल्गोरिदम, और केवल 3 कंटेनरों के लिए कोड है। प्रत्येक कंटेनर कंटेनर में begin() और end() इटरेटर पास करता है। भले ही आपके पास 3 * 2 उत्तर उत्पन्न करने के लिए कोड की रेखाएं हैं, लेकिन केवल 3 + 2 कार्यक्षमता के टुकड़े हैं जिन्हें लिखे जाने की आवश्यकता है।

अधिक कंटेनर और एल्गोरिदम के लिए, यह अलगाव कोड में संयोजक विस्फोट में एक बड़ी कमी है जो अन्यथा आ जाएगा: एसटीएल में 5 अनुक्रम कंटेनर, 8 सहयोगी कंटेनर और 3 कंटेनर एडाप्टर हैं, और लगभग 80 एल्गोरिदम हैं अकेले <algorithm> में (यहां तक ​​कि <numeric> में उन लोगों की गिनती नहीं) तो केवल 16 + 8016 * 80 के बजाय है कि आप, कोड में एक 13 गुना कमी! (बेशक, हर एल्गोरिदम हर कंटेनर पर समझ में नहीं आता है, लेकिन बिंदु स्पष्ट होना चाहिए)।

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

ध्यान दें कि एसटीएल जुदाई में पूरी तरह से संगत नहीं है: std::list कार्यान्वयन विशिष्ट विवरण का उपयोग करता है खुद को सॉर्ट करने के लिए अपने स्वयं के sort सदस्य समारोह है, और std::string सदस्य समारोह एल्गोरिदम, जिनमें से अधिकांश को लागू किया जा सकता था की एक विशाल संख्या है गैर-सदस्य कार्य के रूप में।