2011-11-14 22 views
13

मैं ऑब्जेक्ट्स का एक STL list रखना चाहता हूं जहां प्रत्येक ऑब्जेक्ट में दो int है। बाद में मैं पहले int के मान के बाद सूची को क्रमबद्ध करना चाहता हूं। मैं इस तरह के फ़ंक्शन को कैसे बता सकता हूं जिसे इसे पहले int के बाद क्रमबद्ध करना है?एक कस्टम प्रकार की एक सूची को क्रमबद्ध करना

उत्तर

24

आप कस्टम प्रकार की भविष्यवाणी निर्दिष्ट कर सकते हैं।

typedef std::pair<int, int> ipair; 
std::list<ipair> thelist; 

thelist.sort([](const ipair & a, const ipair & b) { return a.first < b.first; }); 

सी के पुराने संस्करणों ++ में आप एक उचित समारोह लिखने के लिए है: सी ++ 11 में यह सबसे अच्छा एक लैम्ब्डा के साथ किया जाता

bool compFirst(const ipair & a, const ipair & b) { return a.first < b.first; } 

thelist.sort(compFirst); 

(इसके बजाय ipair यदि आप निश्चित रूप से हो सकता है आपके अपनी डेटा संरचना; प्रासंगिक डेटा सदस्य तक पहुंचने के लिए तुलनात्मक रूप से तुलना फ़ंक्शन को संशोधित करें।)

अंत में, यदि यह समझ में आता है, तो आप अपनी कस्टम क्लास को operator< से लैस भी कर सकते हैं। इससे आप किसी भी आदेशित संदर्भ में कक्षा का स्वतंत्र रूप से उपयोग कर सकते हैं, लेकिन इसके परिणामों को समझना सुनिश्चित करें।

+0

हैलो कॉल करें। मैं आपको "पुराना संस्करण" सॉर्ट का उपयोग कर रहा हूं लेकिन यह एक तत्व को छोड़ा जाता है: मूल सूची पर अंतिम तत्व सॉर्ट नहीं किया जाता है, यह हमेशा अंतिम तत्व बना रहता है। क्या आप जानते हैं कि क्या गलत हो सकता है? धन्यवाद –

+0

@ मार्कोकास्टान्हो: मुझे नहीं लगता कि ऐसा हो सकता है/होना चाहिए। लगता है जैसे आपके पास कहीं एक बग है। एक प्रश्न पोस्ट करने के लिए स्वतंत्र महसूस करें; एक * न्यूनतम * पुनरुत्पादन उदाहरण बनाने के लिए सुनिश्चित करें। –

2

std :: list :: sort has a one-argument form, पहला तर्क तुलनात्मक कार्य होने के साथ।

+1

'std :: sort' भी' std :: list's पर काम नहीं करेगा ... :-( –

+2

@KerrekSB: धन्यवाद। कुछ दिन मैं उस व्यक्ति की तलाश करूंगा जिसने फैसला किया कि std :: sort नहीं कर सका बस सूची इटरेटर्स के लिए विशेष हो, लेकिन कक्षा में शामिल किया जाना था। – thiton

+0

मत करो। यह समझ में नहीं आता है। सूची सॉर्टिंग पूरी तरह से अलग है और इसके साथ ही कुछ भी नहीं है। मानक प्रकार * स्वैपिंग मानों द्वारा काम करता है * , जबकि सूची क्रम कंटेनर की प्रकृति का लाभ उठाता है और केवल तत्व नोड्स को फिर से बदलता है। ध्यान दें कि सूची क्रम * एक * इटेटरेटर जोड़ी स्वीकार नहीं करता है! –

1

आप कुछ इस तरह कर सकते हैं:

typedef std::pair<int,int>; 
list<my_type> test_list; 

bool my_compare (my_type a, my_type b) 
{ 
    return a.first < b.first; 
} 

test_list.sort(my_compare); 

हैं प्रकार एक struct या वर्ग यह कुछ इस तरह काम करेगा था:

struct some_struct{ 
    int first; 
    int second; 
}; 

list<some_struct> test_list; 

bool my_compare (const some_struct& a,const some_struct& b) 
{ 
    return a.first < b.first; 
} 

test_list.sort(my_compare); 

या वैकल्पिक रूप से आप अपने struct के लिए operator < परिभाषित कर सकते हैं और बस test_list.sort()

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