2016-04-10 17 views
7

का उपयोग क्यों std नहीं है :: तरह this codeक्यों std नहीं है :: तरह मेरी ऑपरेटर <कार्यान्वयन

#include <iostream> 
#include <vector> 
#include <tuple> 
#include <algorithm> 
using namespace std; 

bool operator<(
    const tuple<int, int>& t1, 
    const tuple<int, int>& t2 
) { 
    return get<1>(t1) > get<1>(t2);// `>` so that it gets sorted in reverse 
} 

int main() { 
    vector<tuple<int, int>> v; 
    for (int i = 0; i < 10; ++i) { 
     v.push_back(make_tuple(0, i)); 
    } 
    cout << "before sort: "; 
    for (auto& x : v) { cout << get<1>(x) << ", "; } 
    cout << endl; 

    auto v2 = v; 
    sort(v2.begin(), v2.end()); 
    cout << "after sort(begin, end): "; 
    for (auto& x : v2) { cout << get<1>(x) << ", "; } 
    cout << endl; 

    sort(v.begin(), v.end(), [](auto& t1, auto& t2) { 
     return get<1>(t1) > get<1>(t2);// `>` so that it gets sorted in reverse 
    }); 
    cout << "after sort(begin, end, comparator): "; 
    for (auto& x : v) { cout << get<1>(x) << ", "; } 
    cout << endl; 

    return 0; 
} 

में मेरी operator< कार्यान्वयन का उपयोग उत्पादन होता है:

before sort: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
after sort(begin, end): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
after sort(begin, end, comparator): 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 

उत्पादन मैं उम्मीद है:

before sort: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
after sort(begin, end): 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 
after sort(begin, end, comparator): 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 
+2

यदि आप इसे देखते हैं http://ideone.com/0h1rYa यह आपके कस्टम 'ऑपरेटर <' को सीधे मानक नेमस्पेस में ले जाने के बाद काम करता है (_ सुझाव नहीं देता कि एक अच्छा विचार_)। तो जब 'std :: tuple ' to 'ऑपरेटर <'से मिलान करते समय यह मानक परिभाषित एक (' नेमस्पेस std' में) पहले (और/या बेहतर मिलान के रूप में) पाता है। – Chad

उत्तर

9

इस तरह नाम देखने समारोह टेम्पलेट्स में काम करता है के साथ क्या करना है (आमतौर पर संदर्भित किया दो चरण लुकअप के रूप में)। std::sort<algorithm> में परिभाषित किया गया है, और < के लिए लुकअप टेम्पलेट परिभाषा (जो आपका नहीं है) के बिंदु पर उन नामों को प्राप्त करेगा और उन कार्यों को आश्रित फ़ंक्शन तर्कों के संबंधित नामस्थानों में मिलेगा (जो std::tuplenamespace std होगा, जिसमें आपका भी शामिल नहीं है)।

चूंकि प्रश्न में तर्क नामस्थान std में हैं, यह वास्तव में उस नामस्थान में अपना अधिभार जोड़ने के लिए अपरिभाषित व्यवहार है। तो आपके विकल्प या तो डिफ़ॉल्ट व्यवहार (जो लेक्सिकोोग्राफ़िकल < होगा) के साथ चिपकने के लिए या अपने स्वयं के कस्टम तुलनित्र प्रदान करने के लिए हैं (जैसा कि आप अपने प्रश्न में करते हैं)।

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