2013-07-21 7 views
11

मुझे std::is_sorted एल्गोरिदम और इसका डिफ़ॉल्ट व्यवहार अच्छी तरह से समझ में नहीं आता है। अगर हम cppreference के लिए तत्पर हैं, यह कहना है कि डिफ़ॉल्ट रूप से std::is_sorted< ऑपरेटर का उपयोग करता है। इसके बजाय, मुझे लगता है कि <= का उपयोग प्राकृतिक होगा।std :: is_sorted और सख्ती से कम तुलना?

1 2 3 3 4 5 

यह true वापस आ जाएगी, भले ही 3 < 3false होना चाहिए: लेकिन मेरी समस्या यह है कि संख्या की निम्न सूची के लिए है। वो कैसे संभव है ?

संपादित करें: यह मेरे विचार से भी बदतर लगता है, क्योंकि std::less_equal<int> गुजरने से उस मामले में झूठी वापसी होगी ... जब मैं तुलनित्र कार्य पास करता हूं तो स्थिति क्या लागू होती है?

+0

[प्रभावी एसटीएल] (http: //www.amazon।com/प्रभावी-एसटीएल विशिष्ट-स्टैंडर्ड-खाका/डी पी/0201749629) स्कॉट Meyers, मद 19 से: "तुल्यता और समानता के बीच के अंतर को समझें" – TemplateRex

उत्तर

10

प्रति 25.4/5:

एक अनुक्रम अगर किसी भी एक तुलनित्र comp के संबंध में क्रमबद्ध किया जाता है यही कारण है कि (स्यूडोकोड) की तरह < से ज्यादा कुछ नहीं, कुछ के साथ किया जा सकता है इटरेटर i अनुक्रम और किसी भी गैर नकारात्मक पूर्णांक n ऐसी है कि i + n एक वैध इटरेटर अनुक्रम का एक तत्व की ओर इशारा करते है की ओर इशारा करते, comp(*(i + n), *i) == false

तो,

1 2 3 3 4 5 

std::less<int>()(*(i + n), *i) के लिए सभी n के लिए false वापस आ जाएगी, जबकि std::less_equal मामले 3 3 के लिए true वापस आ जाएगी।

+0

ठीक समझा, ठीक है, अब यह समझ में आता है, भले ही यह मेरे लिए प्रतिद्वंद्वी है। – Vincent

+0

@Vincent, यह भी मेरे लिए काउंटर सहज ज्ञान युक्त था जब तक मैं स्टैंडर्ड – soon

+1

में :) देखा मैं लगता है कि अगर मैं अपने सभी प्रश्नों के उत्तर मेरे प्रतिनिधि रास्ता अधिक हो जाएगा – aaronman

4

यहां तक ​​कि अगर आप केवल < ऑपरेटर है आप पता लगा सकते हैं, तो दो नंबर बराबर जरूरी नहीं कि बराबर हैं।

if !(first < second) and !(second < first)
then first equivalent to second

इसके अलावा, के रूप में paxdiablo के समाधान वास्तव में पहले उल्लेख किया है, आप is_sorted सूची में ऊपर जा रहा है और लगातार < के लिए जाँच, सच नहीं है अगर यह कभी सच आप बंद है के रूप में लागू कर सकता है।

यहाँ cplusplus.com से समारोह का सही व्यवहार

template <class ForwardIterator> 
    bool is_sorted (ForwardIterator first, ForwardIterator last) 
{ 
    if (first==last) return true; 
    ForwardIterator next = first; 
    while (++next!=last) { 
    if (*next<*first)  // or, if (comp(*next,*first)) for version (2) 
     return false; 
    ++first; 
    } 
    return true; 
} 
+0

मुझे लगता है कि पता है, लेकिन मुझे लगता है कि 'std :: is_sorted' वापसी होगी' सच 'अगर प्रदान की गई स्थिति सभी '(एन, एन + 1)' तत्व के लिए' सत्य 'थी और यह मामला नहीं है। – Vincent

+0

@Vincent का पालन नहीं कर आप – aaronman

+0

विस्तृत अगर मैं तुलनित्र 'std :: कम ', तुलना वापस आ जाएगी गुजारें सकता: 'TRUE'' के लिए (1, 2) ',' 'TRUE' के लिए (2, 3)' लेकिन '(3, 3)' के लिए 'झूठा', इसलिए मैंने सोचा कि एल्गोरिदम यहां रुकता है (पहला 'गलत' पता चला है) और 'झूठा' वापस लौटाता है। लेकिन यह मामला नहीं है। – Vincent

2

आपको लगता है कि यह (सकारात्मक मामले के लिए) की जाँच कर रहा है यह सोचते जा करने के लिए करता है, तो तत्व एन सभी तत्वों के लिए तत्व एन 1 से भी कम है लगता है आखिरी बार यही कारण है कि वास्तव में, बस < के साथ काम नहीं करेंगे, हालांकि आप < और ! साथ <= मूल्यांकन करने के लिए एक 'चाल' का उपयोग कर सकते हैं: कहीं अधिक संभावना है कि यह पता लगाता है (नकारात्मक

if (a <= b) 
if ((a < b) || (!((b < a) || (a < b)))) // no attempt at simplification. 

हालांकि, यह है: निम्न दो बराबर हैं मामला) यदि तत्व एन सभी के लिए तत्व एन -1 से कम है, लेकिन पहले इसे बंद कर दिया जाए, जैसे ही इसे उल्लंघन मिल जाए।

for i = 1 to len - 1: 
    if elem[i] < elem[i-1]: 
     return false 
return true 
संबंधित मुद्दे