2011-10-14 17 views
30

मैंने sort के साथ लैम्ब्डा फ़ंक्शन का उपयोग करने का प्रयास किया, लेकिन "सेगमेंटेशन गलती" त्रुटियां प्राप्त हो रही थीं।सीडी ++ 0x/C++ 11 में lambda फ़ंक्शन के साथ std :: सॉर्ट काम करना चाहिए?

g++ -std=gnu++0x test2.cpp && ./a.out का उपयोग कर

#include <iostream> 
#include <algorithm> 

int main() 
{ 
    const int len = 18; 
    int intArr[len]; 
    for (int i=0;i<len;i++) intArr[i]=1000+i; 
    // The following is expected to sort all but the last element of the array 
    std::sort(intArr, intArr + len -1, [](int a, int b) 
    { 
     std::cout<<"("<<a<<", "<<b<<")\n"; 
     return (a<b?-1:(a>b?1:0)); 
    }); 
    return 0; 
} 

मैं संकलन और Ubuntu 11.04 (64) में इस कोड को चलाने: मैं निम्नलिखित करने के लिए कोड को आसान बनाने में कामयाब रहे।

यह फॉर्म (big_integer, 1008), कुछ (0, 1008) के कुछ जोड़े प्रिंट करता है और "सेगमेंटेशन गलती" से बाहर निकलता है।

+4

बस एक टिप्पणी के रूप में, आप केवल अपने कोड के साथ पहले 17 तत्वों को क्रमबद्ध कर रहे हैं। –

+5

हां। यह तथ्य कोड की एकमात्र टिप्पणी में उल्लेख किया गया है। – fiktor

+0

@KerrekSB: "// निम्नलिखित सभी को सरणी के अंतिम तत्व को सॉर्ट करने की उम्मीद है" – Griwes

उत्तर

33

तुलना भविष्यवाणी को एक बूल वापस करना चाहिए: यदि < बी और अन्यथा गलत है तो सत्य। रिटर्न स्टेटमेंट को इस पर बदलें:

return a < b; 

इसे सी-शैली 3-तरफा तुलनात्मक कार्यों के साथ भ्रमित न करें।

+0

धन्यवाद। वास्तव में मैं गलत था। एक <बी यह काम करता है। – fiktor

+1

गलत भविष्यवाणी के साथ segfaults क्यों कारण है अभी भी मेरे लिए एक रहस्य है। –

+1

@NilsPipenbrinck: 'std :: sort' ने व्यवहार को अपरिभाषित किया है यदि तुलनित्र सख्त कमजोर आदेश नहीं लगाता है। यह अप्रत्याशित नहीं है कि एक segfault परिणाम हो सकता है। – Mankarse

16

भविष्यवाणी एक सरल, कमजोर आदेश लागू करने के लिए माना जाता है। यदि आप पूरी चीज को सॉर्ट करना चाहते हैं तो आपकी सीमा भी बंद है। (मैं याद किया कि है कि जानबूझकर किया गया था।) तो सब सब में हम कुछ इस तरह की तलाश में हैं:

std::sort(intArr, intArr + nelems, [](int a, int b){ return a < b; }); 

या भी:

std::sort(intArr, intArr + nelems); 

छँटाई के लिए डिफ़ॉल्ट विधेय std::less<T> है, जो करता है वास्तव में लैम्ब्डा क्या करता है।

6

'पहला तर्क दूसरे तर्क से भी कम समय? है' है, जो प्रयोग किया जाता है करने के लिए कमजोर आदेश std::sort के लिए विधेय जावा की तरह -1,0,1 नहीं ले करता है, लेकिन इसके बजाय आप एक बूलियन कि सवाल का जवाब वापसी चाहता है तत्वों। चूंकि -1 एक गैर-शून्य मान है, इसे सॉर्ट एल्गोरिदम द्वारा सही माना जाता है, और यह एल्गोरिदम को ब्रेकडाउन का कारण बनता है।

+1

"// निम्नलिखित सभी को सरणी के अंतिम तत्व को क्रमबद्ध करने की उम्मीद है" – Griwes

+0

@Griwes Huh? यह उत्तर से कैसे संबंधित है? –

+0

@ क्रिस्टियन: मेरे पास पहले का संपादन था जो उसके कोड में टिप्पणी को याद करता था। मैंने इसे अपने उत्तर से हटा दिया। ग्रिवे ने जाहिर तौर पर इसे करने से पहले पकड़ा। –

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