2017-06-22 7 views
8

एक विशेष रूप से उपयोगी मानक एल्गोरिथ्म std::equal, जो इस प्रकार परिभाषित किया जाता है:सी ++ एसटीएल एल्गोरिथ्म बराबर

template <typename InputIterator1, typename InputIterator2> 
inline bool equal(InputIterator1 start1, 
InputIterator1 end1, 
InputIterator2 start2) 
{ 
    while(start1 != end1) 
    { 
     if(*start1 != *start2) return false; 
     ++start1; 
     ++start2; 
    } 
    return true; 
} 

एल्गोरिथ्म रेंज [start1, end1) और [start2, start2 + (end1 – start1)) और रिटर्न द्वारा परिभाषित से अधिक चलता रेंज में तत्वों के बराबर हैं, चाहे । ध्यान दें कि एल्गोरिदम दो अलग-अलग प्रकार के इनपुट इटरेटर्स पर templatized है।

यह क्यों है?

+3

उदाहरण के लिए, आप विभिन्न कंटेनर से सामग्री की तुलना करना चाह सकते हैं। – skypjack

उत्तर

5

यह इस तरह से templatized है ताकि आप एक ही प्रकार के दो पुनरावृत्तियों या दो प्रकार के दो iterators पारित कर सकते हैं।



उदाहरण के लिए:

vector<int> a; //some stuff 
list<int> b; //some stuff 
equal(a.begin(), a.end(), b.begin()); 
/* 
Here InputIterator1 is a vector<int>::iterator 
and InputIterator2 is a list<int>::iterator 
*/ 

vector<double> c; //some stuff 
vector<double> d; //some stuff 
equal(c.begin(), c.end(), d.begin()); 
/* 
Here InputIterator1 is a vector<double>::iterator 
and InputIterator2 is also a vector<double>::iterator 
*/ 
12

चलें कहते हैं कि तुम एक std::list<int> और std::vector<int> है और यदि वे बराबर हैं देखना चाहते हैं। यदि std::equal ने विभिन्न इटरेटर प्रकार नहीं लिया है तो आप इसका उपयोग नहीं कर सकते क्योंकि std::list<int>::iteratorstd::vector<int>::iterator जैसा ही नहीं है।

यह एक ही कंटेनर प्रकार पर भी लागू होता है लेकिन विभिन्न तत्वों को संग्रहीत करता है। std::vector<int>::iteratorstd::vector<long long>::iterator जैसा नहीं है और इसलिए यदि आप इसे इटरेटर जोड़े दोनों के लिए समान प्रकार का उपयोग करते हैं तो आप उन की तुलना करने में सक्षम नहीं होंगे।

+0

यह केवल अलग कंटेनर नहीं है जिन्हें समायोजित किया जा सकता है - आप तुलना कर सकते हैं उदा। 'वेक्टर ' से 'वेक्टर '। –

+0

@MarkRansom मैं इसे भी जोड़ दूंगा। – NathanOliver

+0

अच्छी तरह से phrased। क्षमा करें मैं आपको दूसरा +1 नहीं दे सकता। –

8

अब तक आप दो उत्तरों प्राप्त कर चुके हैं जो कंटेनर पर ध्यान केंद्रित करते हैं। यह गलत फोकस है। एसटीएल में मौलिक डेटा अमूर्त अनुक्रम है। एक अनुक्रम को इटरेटर की एक जोड़ी द्वारा परिभाषित किया जाता है। कंटेनर अनुक्रमों का प्रबंधन करने का एक तरीका हैं, लेकिन वे एकमात्र तरीका नहीं हैं। तो, सही < जी> जवाब देने के लिए:

std::equal समानता के लिए दो दृश्यों तुलना करती है। एल्गोरिदम के अनुक्रमों को उसी अनुक्रमक प्रकार के लिए सीमित करने का कोई अच्छा कारण नहीं है, इसलिए ऐसी कोई सीमा नहीं है। अनुक्रमों में भिन्न उत्पत्ति हो सकती है, और विभिन्न मान प्रकारों का उल्लेख हो सकता है।

उदाहरण के लिए, आप यह जांचना चाहेंगे कि फ़ाइल में प्रतिनिधित्व किए गए मान जो डबल मानों का टेक्स्ट प्रस्तुति रखते हैं, स्मृति में संग्रहीत पूर्णांक के वेक्टर की सामग्री के समान है। वेक्टर एक अनुक्रम परिभाषित करता है; आप begin() और end() के साथ अपने iterators पर प्राप्त कर सकते हैं। फ़ाइल एक अनुक्रम परिभाषित करता है; आप ifstream के साथ फ़ाइल खोलकर और istream_iterator<double> ऑब्जेक्ट्स की एक जोड़ी बनाकर अपने इटरेटर पर जा सकते हैं। std::equal (और बाकी सभी मानक एल्गोरिदम) डेटा के इन अलग-अलग स्रोतों और उनके विभिन्न डेटा प्रकारों के साथ ठीक काम करेंगे।

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