2012-06-28 7 views
7

मैं कम से http://www.sgi.com/tech/stl/nth_element.htmlstd :: nth_element (a.begin(), a.end(), a.end()) का क्या प्रभाव है?

template <class RandomAccessIterator> 
void nth_element(RandomAccessIterator first, RandomAccessIterator nth, 
       RandomAccessIterator last); 

नोट std::nth_element का विवरण पढ़ पूर्व शर्त हैं कि

  1. [पहले n वें) किसी मान्य श्रेणी है।
  2. [एनएचटी, अंतिम) एक मान्य सीमा है।

मेरा प्रश्न है:

यह std::nth_element(a.begin(), a.end(), a.end()) कॉल करने के लिए मान्य है? यदि हां, तो इसका क्या प्रभाव है? यह उपरोक्त पूर्व शर्त का उल्लंघन नहीं करता है, वैसे भी। भाषा मानक (या अन्य दस्तावेजों) में कहीं भी कहा गया है कि ntha में किसी तत्व को इंगित करना चाहिए?

+1

आप इसे क्यों नहीं देखते हैं और प्रभाव देखते हैं। –

+2

एक प्रयास का परिणाम विश्वसनीय नहीं है। यह कार्यान्वयन पर निर्भर हो सकता है। असल में मुझे आश्चर्य है कि यह समस्या सी ++ के मानक में निर्दिष्ट कहां है। – updogliu

+0

@updogliu नवीनतम मानक पाठ आपके द्वारा लिंक किए गए एसजीआई पृष्ठ के समान ही है। – Potatoswatter

उत्तर

5

यह मान्य है और संभव है, लेकिन मानक, एक शून्य ऑपरेशन द्वारा गारंटी नहीं है। दिए गए आंकड़ों के साथ, दो पूर्व शर्त बनें:

[a.begin(), a.end()) is a valid range. 
[a.end(), a.end()) is a valid range. 

जो दोनों सत्य हैं, दूसरा अंतराल खाली है। मानक 25.3.2/1 से:

बाद nth_element स्थिति में तत्व वें द्वारा की ओर इशारा किया तत्व यह है कि उस स्थिति में हो सकता है अगर पूरी श्रृंखला अलग कर लिए जाते है। रेंज [nth, last) में किसी भी इटरेटर I [श्रेणी, पहले) और किसी भी इटरेटर जे में यह भी है कि यह है:! (* I> * j) या comp (* j, * i) == झूठी।

तो पूरी श्रृंखला सॉर्ट किया गया था मूल a.end()a.end() पर होगा और दूसरे भाग के लिए रेंज [nth, last) रिक्त है तो वहाँ जिसके लिए !(*i > *j) और comp(*j, *i) == false की स्थिति का मूल्यांकन करने के लिए कोई तत्व हैं।

+0

दावे का समर्थन करने के लिए कोई तर्क? – Potatoswatter

+0

@Potatoswatter मुझे लगता है कि आपने मुझे अन्य उत्तरों पर अपनी टिप्पणी में अपना मामला बनाने में मदद की है। –

+2

डाउनवोट स्क्वायर:^2। – Potatoswatter

0

नहीं, यह मान्य नहीं है क्योंकि nth[first, last) सीमा के भीतर होना चाहिए।

+0

संपादन के लिए धन्यवाद, @ लुइसियन। –

+0

उस आवश्यकता कहां कहा गया है? यह कहता है "इटेटरेटर एनएच द्वारा इंगित तत्व तत्व के समान है जो उस स्थिति में होगा ..." लेकिन यह आवश्यकता केवल शून्य है अगर यह किसी भी चीज़ को इंगित नहीं करती है। – Potatoswatter

0

नहीं, std::nth_element(a.begin(), a.end(), a.end()) मान्य नहीं है - यह दूसरी पूर्व शर्त का उल्लंघन करता है, जिसके लिए nth इटरेटर (दूसरा तर्क) मान्य तत्व को इंगित करता है। a.end() हालांकि वैध तत्व को इंगित नहीं करता है।

+1

से पहुंच योग्य है, लेकिन सी ++ में सभी श्रेणियां आधे खुली हैं, और '[ए, ए)' हमेशा खाली सीमा होती है। स्पष्ट आवश्यकता नहीं है कि 'nth' अस्वीकार्य हो। – Potatoswatter

+0

धन्यवाद, मैं अभी भी निर्णय ले रहा हूं कि मेरा जवाब निकालना है, लेकिन मुझे अभी भी यह विश्वास नहीं है कि यह गलत है :) –

+0

पोटाटोस्वाटर ने मेरी मुख्य चिंता व्यक्त की। – updogliu

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