2017-03-09 10 views
6

में max_element और minmax_element के व्यवहार में अंतर सी ++ max_element में, यदि अधिकतम तत्व हैं जो अधिकतम हैं, तो यह पहला ऐसा तत्व देता है। जबकि minmax_element (सी ++ 11 आगे) अंतिम अधिकतम तत्व देता है।सी ++ एसटीएल

क्या इस व्यवहार के लिए मानकों से कोई कारण है?

cplusplus.com

एक से अधिक समान तत्व सबसे बड़ा मान है, तो से , ऐसे तत्वों के अंतिम करने के लिए दूसरा इटरेटर अंक।

तुलना पहले संस्करण के लिए ऑपरेटर < या दूसरे के लिए कंप का उपयोग करके किया जाता है; यदि कोई अन्य तत्व उससे कम की तुलना नहीं करता है तो एक तत्व सबसे बड़ा होता है। यदि एक से अधिक तत्व इस स्थिति को पूरा करते हैं, तो इटरेटर ने ऐसे तत्वों के पहले बिंदुओं को वापस कर दिया। जब एक एक minmax_element डिजाइन करने के लिए कोशिश करता है, प्रक्रिया (Cormen, Leiserson, रिवेस्ट में प्रस्तावित का उपयोग कर अपने पुस्तकालय की

+0

[सीपीपी संदर्भ के अनुसार यह अपेक्षित व्यवहार है।] (Http://en.cppreference.com/w/cpp/algorithm/minmax_element) यह क्यों अपेक्षित है, मुझे मानक में तैराकी करना होगा । – user4581301

+0

** [alg.min.max] ** (rev n4594 में 30 नोट) यह कानून होने का आदेश देता है। कोई तर्कसंगत सूचीबद्ध नहीं है। – user4581301

+0

और भी दिलचस्प बात यह है कि 'minmax_element' न्यूनतम तत्व के लिए विपरीत नीति लागू करता है (पहला लौटाया जाता है)। –

उत्तर

4

बूस्ट के दस्तावेज़ rationale

परिभाषा समस्या सतहों में शामिल हैं: "एल्गोरिथम का परिचय", धारा 9.1)। [3, 2) तुलना में केवल 3 एन/2 तुलनाओं का उपयोग करके एल्गोरिदम प्राप्त करना संभव होना चाहिए, यदि कोई व्यक्ति पहले तत्वों को पहले_min_first_max_element() नामक फ़ंक्शन लिखने का प्रयास करता है जो std :: min_element और std :: max_element दोनों को देता है जोड़ी, मामूली कार्यान्वयन काम नहीं करता है। समस्या, बल्कि संक्षेप में, बराबर तत्वों के बारे में है: मुझे प्रति जोड़े केवल तीन तुलना करने के लिए एक रास्ता खोजने के लिए थोड़ी देर के लिए सोचना था और पहले मिनट और पहले अधिकतम तत्वों को वापस करना था। लंबे समय तक, ऐसा लगता है कि ऐसा करने के किसी भी प्रयास से सबसे खराब मामले में प्रति जोड़े चार तुलना का उपभोग होगा। यह कार्यान्वयन तीन प्राप्त करता है।

max_element के अर्थ को बदलने के लिए यह संभव नहीं है (या यहां तक ​​कि वांछनीय), लेकिन यह अभी भी minmax_element नामक फ़ंक्शन प्रदान करने के लिए फायदेमंद है, जो min_element और max_element की एक जोड़ी देता है। हालांकि यह min_element और max_element को कॉल करने में काफी आसान है, यह 2 (एन -1) तुलना करता है, और इनपुट पर दो पास की आवश्यकता होती है। इसके विपरीत, minmax_element कम तुलना करेगा और इनपुट पर एक एकल पास करेगा। बचत तब महत्वपूर्ण हो सकती है जब इटरेटर प्रकार कच्चे सूचक नहीं है, या यहां तक ​​कि इनपुट इनपुटर अवधारणा का एक मॉडल भी है (हालांकि उस स्थिति में इंटरफ़ेस को बदलना होगा, क्योंकि रिटर्न प्रकार की प्रतिलिपि नहीं बनाई जा सकती थी, इसलिए कोई भी प्रतिलिपि बना सकता था उदाहरण के लिए एक मूल्य वापस)।

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