2013-08-07 5 views
12

Heyho,जोड़े का एक वेक्टर छंटाई

मैं जोड़े का एक वेक्टर छँटाई के बारे में एक प्रश्न है:

std::vector<std::pair<double,Processor*>> baryProc; 

इस सदिश पहले से ही जोड़े के साथ भरा है। अब मैं वेक्टर जोड़ी के अंदर डबल मूल्य के आधार पर अंदर जोड़े सॉर्ट करने के लिए चाहता था

उदाहरण:

लगता है मैं वेक्टर के अंदर 3 जोड़े की है। जोड़ी 1 आगे है और जोड़ी 3 अंत में है। जोड़ी 2 बीच में है:

pair1(1, proc1) 
pair2(3, proc2) 
pair3(2.5, proc3) 

अब मैं जोड़े को डबल मान के आधार पर सॉर्ट करना चाहता हूं। ताकि वेक्टर के अंदर का आदेश है:

pair1(1, proc1) 
pair3(2.5, proc3) 
pair2(3, proc2) 

मैं यह कैसे कर सकता हूं? मैं काफी अटक गया हूँ।

मदद

उत्तर

22

सी ++ में के लिए धन्यवाद, आप कस्टम तुलनित्र कार्यों है कि क्या एक तत्व जब छँटाई एक और पहले चला जाता है तय करने के लिए कैसे निर्दिष्ट करें कि हो सकता है। आपके मामले में, 2 जोड़े दिए गए हैं, आप चाहते हैं कि पहले तत्व के लिए दूसरे के पहले जाने के लिए निम्न मान के साथ एक। तुम इतनी तरह एक तुलनित्र समारोह लिख सकते हैं:

//The sort function will use your custom comparator function 
std::sort(baryProc.begin(), baryProc.end(), pairCompare); 
+1

'std :: pair' के सामान्य कम-ऑपरेटर से '.second' तुलना को समाप्त करने का एक अच्छा उदाहरण +1 करता है। मैं इसके लिए एक मज़ेदार (इनलाइन करने की अधिक संभावना) पसंद करूंगा, लेकिन एक कार्यात्मक समाधान कम-से-कम काम करता है। – WhozCraig

+0

इस अच्छी व्याख्या के लिए धन्यवाद। मुझे लगता है कि मानक तुलनित्र ठीक काम करेगा। यदि डबल मान अक्सर समान होते हैं तो ओपारेटर सॉर्ट सही होगा? उदाहरण: (1, proc1), (1, proc2), (2, proc3), (3, proc4), (3, proc5), .... – user2633791

+1

@ user2633791 आप जो पूछ रहे हैं वह यह है कि सॉर्ट है [स्थिर] (http://en.wikipedia.org/wiki/Stable_sort#Stability)। एक सॉर्टिंग एल्गोरिदम स्थिर है यदि समान मूल्य वाले दो तत्व उसी क्रम में एक दूसरे के सापेक्ष एक ही क्रम में रहते हैं जैसे कि वे शुरुआत में थे। डिफ़ॉल्ट सॉर्ट एल्गोरिदम स्थिर नहीं है, लेकिन एसटीएल एक [स्थिर प्रकार] प्रदान करता है (http://www.cplusplus.com/reference/algorithm/stable_sort/) जो आपके उद्देश्यों के अनुरूप होना चाहिए। – maditya

25
#include <algorithm> 

int main(){ 

    std::vector<std::pair<double,Processor*>> baryProc; 

    std::sort(baryProc.begin(),baryProc.end()); 
} 

ध्यान दें कि आपकी वजह से डिफ़ॉल्ट तुलनित्र एक कस्टम तुलनित्र की जरूरत नहीं है:

// This function returns true if the first pair is "less" 
// than the second one according to some metric 
// In this case, we say the first pair is "less" if the first element of the first pair 
// is less than the first element of the second pair 
bool pairCompare(const std::pair<double, Processor*>& firstElem, const std::pair<double, Processor*>& secondElem) { 
    return firstElem.first < secondElem.first; 

} 

अब, अपनी तरह विधि में इस समारोह को पारित जोड़ी आप चाहते हैं जोड़ी करता है। यह पहले पहले तत्व से तुलना करता है और यदि वे समान हैं, तो यह जोड़ी में दूसरे तत्व की तुलना करता है।

+0

यह * काम करेगा * 'डबल' मानों को अद्वितीय (प्रभावी रूप से" सेट ") की गारंटी दी जाती है। लेकिन ऐसी गारंटी के बिना यदि आवश्यक हो तो बल) आपको एक तुलनित्र लिखने की जरूरत है। 'जोड़ी' के लिए डिफ़ॉल्ट तुलनित्र आमतौर पर 'वापसी' करता है (ए। फर्स्ट <बी। फर्स्ट || (ए। फर्स्ट == बी। फर्स्ट एंड ए.सेकंड <बी। सेकेंड ; 'उत्तरार्द्ध सूचक-तुलना है जो आपको' पहले 'के लिए गैर-अद्वितीय मानों के साथ काट देगा। – WhozCraig

+0

हमारे पास यह जानने में कोई शर्त नहीं है कि पहले तत्व समान होने पर क्या करना है। तो अगर हम डिफ़ॉल्ट तुलनित्र का उपयोग करते हैं तो क्या होगा –

+0

आपने 'std :: vector' और' std :: pair' क्यों निर्दिष्ट नहीं किया लेकिन 'std :: sort' नहीं? अगर आपने ऐसा किया है, तो आप 'नेमस्पेस std' बिट का उपयोग करके' पूरी तरह से छुटकारा पा सकते हैं। – Kevin

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