2013-06-03 6 views
13

मैं) जोड़ीC++ कस्टम तुलना std :: तरह()

यहाँ एसटीडी के लिए कस्टम तुलना समारोह बनाने के लिए :: तरह (कुछ कुंजी-मान जोड़ों एसटीडी सॉर्ट करने के लिए :: चाहते हैं के लिए समारोह मेरी समारोह

है

vector<pair<K,V>> items; 

और तरह के लिए कुछ विधि कुंजी द्वारा इस सदिश, std :: तरह()

का उपयोग कर:
template <typename K, typename V> 
int comparePairs(const void* left, const void* right){ 
     if((((pair<K,V>*)left)->first) <= (((pair<K,V>*)right)->first)) 
      return 1; 
     else 
      return -1; 
    } 

फिर, कुछ वर्ग के अंदर मैं जोड़े वर्ग के सदस्य के वेक्टर है

std::sort(items.begin(), items.end(), comparePairs<K,V>); 

मैं भीतर संकलन त्रुटियाँ हैं, जिसमें कहा गया

" 'std :: जोड़ी < _Ty1, _Ty2>' के लिए 'स्थिरांक शून्य *' से पैरामीटर संख्या परिवर्तित नहीं कर सकते" । गलती क्या है?

+2

तुम क्यों कर रहे हैं अपने पैरामीटर को 'शून्य * 'के रूप में लेना? 'std :: pair की तरह क्यों नहीं? –

+5

गलती यह है कि आप तुलनित्र को 'qsort' के लिए' std :: sort' पर भ्रमित कर रहे हैं, जिसके लिए 'कॉन्स्ट शून्य *' तर्क की आवश्यकता होती है। 'Std :: sort' के लिए एक उचित तुलनित्र लिखें जो' जोड़ी 'संदर्भों को स्वीकार करता है और समस्या दूर हो जाएगी। – user4815162342

+0

जब कोई अनुसंधान, पढ़ने, ध्यान देने, सोचने, या कुछ और करने की पूरी कमी दिखाता है, तो कोई इसे क्यों उखाड़ फेंक देगा? –

उत्तर

19

std::pair में पहले से ही आवश्यक तुलना ऑपरेटर हैं, जो प्रत्येक जोड़ी के दोनों तत्वों का उपयोग करके शब्दावली तुलना करते हैं। इसका उपयोग करने के लिए, आपको केवल K और V प्रकारों के लिए तुलना ऑपरेटर प्रदान करना होगा।

यह भी ध्यान रखें कि std::sort को strict weak ordeing तुलना की आवश्यकता है, और <= इसे संतुष्ट नहीं करता है। उदाहरण के लिए, आपको <K और V के लिए तुलना की तुलना में कम की आवश्यकता होगी। उस जगह में के साथ, आप सभी की जरूरत

std::vector<pair<K,V>> items; 
std::sort(items.begin(), items.end()); 

है क्या तुम सच में अपनी खुद की तुलना समारोह प्रदान करने की आवश्यकता है, तो आप

template <typename K, typename V> 
bool comparePairs(const std::pair<K,V>& lhs, const std::pair<K,V>& rhs) 
{ 
    return lhs.first < rhs.first; 
} 
9

की तर्ज आपका तुलना समारोह भी गलत नहीं है के साथ कुछ की जरूरत है।

इसके तर्क श्रेणी में संग्रहीत प्रकार होना चाहिए, यानी std::pair<K,V>, const void* नहीं।

इसे bool को सकारात्मक या नकारात्मक मान नहीं देना चाहिए। (bool)1 और (bool)-1true हैं इसलिए आपका फ़ंक्शन प्रत्येक ऑब्जेक्ट से पहले ऑर्डर किया गया है अन्य ऑब्जेक्ट, जो स्पष्ट रूप से असंभव है।

आपको कम से कम ऑपरेटर मॉडल करने की आवश्यकता है, strcmp या memcmp शैली तुलना नहीं।

StrictWeakOrdering देखें जो फ़ंक्शन को पूरा करने वाले गुणों का वर्णन करता है।

15

यहां देखें: http://en.cppreference.com/w/cpp/algorithm/sort

इसे कहते हैं:

template< class RandomIt, class Compare > 
void sort(RandomIt first, RandomIt last, Compare comp); 
  • कंप्यूटर अनुप्रयोग - तुलना समारोह जो सच लौटाता है यदि पहला तर्क दूसरे तर्क से कम है। तुलना समारोह के हस्ताक्षर के बाद के बराबर होना चाहिए: bool cmp(const Type1 &a, const Type2 &b);

इसके अलावा, आपके द्वारा std::sort का उपयोग एक कस्टम सी ++ 14 बहुरूपी लैम्ब्डा का उपयोग कर सकते हैं का एक उदाहरण है:

std::sort(std::begin(container), std::end(container), 
      [] (const auto& lhs, const auto& rhs) { 
    return lhs.first < rhs.first; 
}); 
+0

नहीं छोड़ा जाना चाहिए। सबसे पहले lhs.first हो? –

+0

@racarate ओह, संपादित। धन्यवाद! – Snps

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