परिभाषा के अनुसार, std :: बराबर एल्गोरिदम केवल एक 'अंतिम' इटेटरेटर लेता है। स्टैकओवरफ्लो पर कई पोस्ट इंगित करती हैं कि दो श्रेणियों के बीच समानता करने के लिए, सबसे पहले यह जांचना चाहिए कि श्रेणियों के पास std :: बराबर कॉल करने के अलावा समान आकार है। यदि यादृच्छिक अभिगम इटरेटर उपलब्ध हैं, तो यह कोई भी सामग्री ओवरहेड नहीं जोड़ता है। हालांकि, ऐसा लगता है कि यादृच्छिक अभिगम इटरेटर्स के बिना, पहले कोड खंड, केवल मौजूदा एसटीएल एल्गोरिदम के साथ लागू किया गया है, दूसरे कोड खंड से धीमा होगा, जो एक कस्टम "समकक्ष" एल्गोरिदम (एसटीएल का हिस्सा नहीं) का प्रतिनिधित्व करता है। मेरा सवाल यह है कि मौजूदा एसटीएल एल्गोरिदम का उपयोग करके कोडित किसी भी एल्गोरिदम की तुलना में 2 अधिक कुशल है? यदि हां, तो यह एल्गोरिदम एसटीएल का हिस्सा क्यों नहीं है?समकक्ष श्रेणियों के लिए एसटीएल एल्गोरिदम
टुकड़ा 1:
template <typename IITR1, typename IITR2>
bool equivalent(IITR1 first1, IITR1 last1, IITR2 first2, IITR2 last2)
{
return distance(first1, last1) == distance(first2, last2) &&
equal(first1, last1, first2);
}
टुकड़ा 2:
template <typename IITR1, typename IITR2>
bool equivalent(IITR1 first1, IITR1 last1, IITR2 first2, IITR2 last2)
{
while (first1 != last1 && first2 != last2) {
if (!(*first1 == *first2)) return false;
++first1; ++first2;
}
return first1 == last1 && first2 == last2;
}
नोट: मैं इसे की जाँच नहीं की है, लेकिन मैं बहुत संदिग्ध है कि संकलक टुकड़ा अनुकूलित करेंगे 1 ऐसी है कि वह पैदा करता होगा खंड 2 द्वारा उत्पादित एक ही प्रदर्शन के साथ कोड।
पूरा होने के लिए, निम्नलिखित कोड खंड बेकार के बगल में है, क्योंकि यह सीमा असफल होने पर असफल हो जाएगी:
template <typename IITR1, typename IITR2>
bool equivalent(IITR1 first1, IITR1 last1, IITR2 first2, IITR2 last2)
{
return equal(first1, last1, first2) && equal(first2, last2, first1);
}
समस्या यह है कि मुझे नहीं पता कि सीमा की लंबाई समान हैं और जांच कर रही है कि वे लागत-समय पर मेल खाते हैं। – MarkB
कोई बात नहीं, मुझे नहीं पता था कि वे * विकल्प * थे। टुकड़ा 2 अच्छा लग रहा है, और सबसे अच्छा समाधान की तरह। –