std::equal()
असुरक्षित है क्योंकि फ़ंक्शन यह नहीं पता कि यह तुलना करने के लिए दूसरे कंटेनर की लंबाई को ओवरराउन कर देगा या नहीं। यही कारण है:क्या std :: बराबर के लिए कोई सुरक्षित विकल्प है?
std::vector<int> v(100);
std::vector<int> w(10);
bool same = std::equal(v.begin(), v.end(), w.begin());
... एक बफर w
के लिए सीमा से अधिक का परिणाम देगा।
स्वाभाविक रूप से हम इन चीजों (v.size() == w.size()
) के लिए परीक्षण कर सकते हैं, लेकिन विजुअल स्टूडियो 2010 जैसे कंपाइलर्स अभी भी फ़ंक्शन को असुरक्षित के रूप में रिपोर्ट करते हैं। और वास्तव में यह कुछ मौलिक अर्थों में असुरक्षित है: अनुभव के विभिन्न स्तरों के प्रोग्रामर की एक टीम अंततः आकारों की तुलना करना भूल जाएगी।
एक सुरक्षित विकल्प लागू करना आसान है।
template< typename Iter1, typename Iter2 >
bool equal_safe(Iter1 begin1, Iter1 end1, Iter2 begin2, Iter2 end2)
{
while(begin1 != end1 && begin2 != end2)
{
if(*begin1 != *begin2)
{
return false;
}
++begin1;
++begin2;
}
return begin1 == end1 && begin2 == end2;
}
लेकिन क्या मानक पुस्तकालय में कोई सुरक्षित विकल्प है?
वास्तव में क्या करने के लिए सुरक्षित विकल्प? बस दो 'std :: वेक्टर की तुलना करें? या दो इटरेटर रेंज? –
@sftrabbit क्या करने के लिए std :: बराबर() करता है। दो पुनरावर्तक श्रेणियों की तुलना करने के लिए। – OldPeculier
यदि == आपकी आवश्यकताओं को पूरा नहीं करता है तो सुरक्षित_equal कार्यान्वयन लिखना काफी आसान है। –