2013-05-01 12 views
15

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; 
} 

लेकिन क्या मानक पुस्तकालय में कोई सुरक्षित विकल्प है?

+2

वास्तव में क्या करने के लिए सुरक्षित विकल्प? बस दो 'std :: वेक्टर की तुलना करें? या दो इटरेटर रेंज? –

+0

@sftrabbit क्या करने के लिए std :: बराबर() करता है। दो पुनरावर्तक श्रेणियों की तुलना करने के लिए। – OldPeculier

+1

यदि == आपकी आवश्यकताओं को पूरा नहीं करता है तो सुरक्षित_equal कार्यान्वयन लिखना काफी आसान है। –

उत्तर

17

सी ++ 14 में क्या देख रहे है, मानक पुस्तकालय std::equal कि iterators के दो जोड़े, अपने safe_equal के लिए इसी तरह लेता है के एक संस्करण शामिल होंगे। std::mismatch और std::is_permutation के लिए वही।

8

vector में एक ऑपरेटर == है जो पहले आकार की जांच करता है। अपने उदाहरण में, बस v==w की स्थिति का उपयोग करें।

+0

जिसका अर्थ है कि यह सुरक्षित की ओपी की परिभाषा के अनुसार सुरक्षित है। –

+0

ठीक है, मैंने सोचा था कि यह स्पष्ट हो गया है, लेकिन सेशन के उदाहरण के लिए, "वी == डब्ल्यू" सुरक्षित है। – huskerchad

+0

@ हुस्करचैड मैंने वैक्टरों को एक उदाहरण के रूप में इस्तेमाल किया क्योंकि यह दो अलग-अलग आकारों के साथ बनाने के लिए त्वरित है। लेकिन कल्पना कीजिए कि एक एक सूची ... – OldPeculier

1

मुझे ऐसी सुविधा चाहिए था। मैं मानक पुस्तकालय में कोई सुविधा नहीं पा रहा हूं।

यदि आप बढ़ावा देने के लिए तैयार हैं। Boost.Range के बराबर है जो मुझे लगता है आपके लिए http://www.boost.org/doc/libs/1_53_0/libs/range/doc/html/range/reference/algorithms/non_mutating/equal.html

+1

1.54 बूस्ट (जुलाई के शुरू में जारी किया जाएगा) 'equal',' is_permutation' और 'mismatch' के चार इटरेटर संस्करणों में शामिल है।आप आज बूस्ट ट्रंक से कोड पकड़ सकते हैं। –

1

मुझे एक ही समस्या मिली और बराबर से पहले वेक्टर के आकार की जांच करके इसे हल किया गया।

std::vector<int> v(100); 
    std::vector<int> w(10); 
    bool same = (v.size() == w.size()) && std::equal(v.begin(), v.end(), w.begin()); 
0

तुम भी std::lexicographical_compare दो बार का उपयोग करता है, तो या तो अनुक्रम अन्य से भी कम है निर्धारित करने के लिए कर सकते हैं।

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