2015-09-16 16 views
5

में इस्तेमाल नहीं किया जा रहा है, मैंने pair<int,int> के लिए ऑपरेशन से कम अधिभारित किया है, ताकि मैं एक वेक्टर को किसी विशेष तरीके से सॉर्ट कर सकूं। मैं चाहता हूं कि यह एक जोड़ी की पहली कुंजी के अनुसार आरोही क्रम में हो, और यदि पहली कुंजी बराबर होती है, तो मैं दूसरी कुंजी के अनुसार इसे अवरोही क्रम में चाहता हूं।ओवरलोडेड ऑपरेटर <जोड़ी

समस्या यह है कि सॉर्ट फ़ंक्शन ओवरलोडेड < ऑपरेटर का उपयोग नहीं कर रहा है, लेकिन यदि < 2 जोड़े पर कॉल किया जाता है, तो आउटपुट लौटाया जाता है जो मैं अपेक्षा करता हूं। मैं कोड का एक टुकड़ा संलग्न है, जिसके नीचे मैं परीक्षण के लिए उपयोग कर रहा हूँ:

#include <iostream> 
#include <vector> 
#include <algorithm> 

using namespace std; 
bool operator<(pair<int, int> &a, pair<int, int> &b) 
{ 
    if (a.first < b.first) return true; 
    else if ((a.first == b.first) && (a.second > b.second)) return true; 
    return false; 
} 

int main() { 
    vector<pair<int, int>> test {make_pair(1,10), make_pair(3,4), make_pair(3,8), make_pair(6, 23), make_pair(1,6)}; 
    sort(test.begin(), test.end()); 
    for (int i = 0; i < test.size(); i++) 
     cout << test[i].first << " - " << test[i].second << " "; 
    cout << endl; 
    auto a = make_pair(3,4); 
    auto b = make_pair(3,8); 
    cout << (a < b) << endl; 
    return 0; 
} 

इनपुट वेक्टर {(1,10), (3,4), (3,8), (6,23), (1,6)} है।

मुझे उम्मीद है कि आउटपुट {(1,10), (1,6), (3,8), (3,4), (6,23)} होगा।

प्राप्त आउटपुट {(1,6), (1,10), (3,4), (3,8), (6, 23)} है।

जैसा कि आप देख सकते हैं, प्राप्त आउटपुट वह है जिसे आप ओवरलोडिंग के बिना मानक < ऑपरेटर का उपयोग करके प्राप्त करेंगे। तो मैंने सोचा कि यह एक मुद्दा हो सकता है, और (3,4) < (3,8) की जांच की। इस मामले में, मेरा ओवरलोडेड ऑपरेटर के अनुसार, जवाब झूठा के रूप में वापस कर दिया गया था। तो मैं गलत कहां जा रहा हूँ? ओवरलोडेड ऑपरेटर द्वारा sort क्यों प्रभावित नहीं किया जा रहा है? इसी तरह के मुद्दों के बारे में SO पर कई प्रश्न हैं, लेकिन इससे कोई मदद नहीं मिली।

+0

@LightnessRacesinOrbit: हाँ, मैंने किया। आपको क्या गलत लगता है? – therainmaker

उत्तर

11

वहां पहले से ही एक operator<std नाम स्थान में जोड़े के लिए परिभाषित किया गया है, और है कि एक ही है कि है कि आप प्रयोग कर रहे हैं std::sort के संस्करण के द्वारा पाया है। आपका अधिभार कभी नहीं मिला है। बजाय एक नामित विधेय का उपयोग करें:

struct MyPairComparator 
{ 
    bool operator()(const std::pair<int, int> & a, 
        const std::pair<int, int> & b) const 
    { 
     // ... 
    } 
}; 

sort(test.begin(), test.end(), MyPairComparator()); // ADL, maybe 
//        ^^^^^^^^^^^^^^^^^^ 

इसके अलावा, विधेय निरंतर मूल्यों के साथ प्रतिदेय होना चाहिए, इसलिए या तो मूल्य द्वारा या स्थिरांक संदर्भ द्वारा तर्क ले।

ध्यान दें कि sortstd नामस्थान में रहता है। इसके विपरीत, जब आप <main में अभिव्यक्ति का उपयोग करते हैं, तो वैश्विक नामस्थान में आपका स्वयं का अधिभार वास्तव में मिलता है।

+0

फिर जब मैं 'a therainmaker

+3

@therainmaker: अपडेट किया गया। 'std :: less' मानक लाइब्रेरी में एक नामित अनुमान है जो (आमतौर पर)' <'का उपयोग करता है, लेकिन उपयोगकर्ता प्रकारों के लिए विशिष्ट हो सकता है। ऑर्डर करने वाले कंटेनर इसे डिफ़ॉल्ट तुलनित्र के रूप में उपयोग करते हैं, लेकिन एल्गोरिदम आमतौर पर अनुमानित संस्करण के लिए अलग ओवरलोड होते हैं (हालांकि @TC ने बताया है, गैर-अनुमानित फॉर्म ['std :: less 'का उपयोग कर पूर्वानुमान फ़ॉर्म में प्रतिनिधि हो सकता है सी ++ 14] (http://stackoverflow.com/questions/20317413/what-are-transparent-comparators))। –

1

ऐसा लगता है कि आप एक सी ++ 11 कंपाइलर का उपयोग करते हैं, सही और लैम्ब्डा कार्यों का उपयोग करके इसे आसान बनाते हैं।

sort(test.begin(), test.end(), [](const pair<int, int> & a, const pair<int, int> & b) { 
    if (a.first < b.first) return true; 
    else if ((a.first == b.first) && (a.second > b.second)) return true; 
    return false; 
}); 
+2

मुझे नहीं लगता कि यह एक सुधार है, खासकर यदि वह उस भविष्यवाणी का पुन: उपयोग करना चाहता है। लेकिन शायद यह सिर्फ मुझे है। – TartanLlama

+10

"ऐसा लगता है कि आप एक सी ++ 11 कंपाइलर का उपयोग करते हैं" .... और फिर आप आगे बढ़ते हैं और सी ++ 14 सुविधा का उपयोग करते हैं। –

+0

@ टी.सी. माफ करना मेरा बुरा। इस पर ध्यान दिलाने के लिए धन्यवाद। सही किया। – Shreevardhan

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