2011-01-05 38 views

उत्तर

33
std::vector<std::pair<std::string, bool> > v; 
std::sort(v.begin(), v.end()); 

std::pair भार के operator<second तत्व द्वारा तो first तत्व द्वारा पहले सॉर्ट करने के लिए। इस प्रकार, यदि आप डिफ़ॉल्ट सॉर्ट ऑर्डरिंग (operator<) का उपयोग करके vector को सॉर्ट करते हैं, तो आपको वांछित ऑर्डरिंग मिल जाएगी।

+1

यह एक सी ++ 0x केवल उत्तर है। ;) संपादित करें: अब तय किया गया है ('>>' टोकन दो नेस्टेड टेम्पलेट बंद कर रहा है '<> 'जोड़े केवल सी ++ 0x है)। –

+0

@ चार्ल्स: हा! हाँ, मैं शायद इसे बहुत सारे जवाब में करता हूं। मैं भी एक कंपाइलर का उपयोग करने के लिए प्रयोग किया जाता है जो '>>' का समर्थन करता है। –

+4

+1: मुझे नहीं पता था कि 'std :: pair :: ऑपरेटर <() 'अधिभारित था। मैं अब करुँ! –

0

आप केवल .first जोड़े पर ऑर्डर करने के लिए कस्टम तुलनाकर्ता का उपयोग कर सकते हैं।

sort(begin, end, 
    compose2(less<string>(), 
       select1st<pair<string, bool> >(), 
       select1st<pair<string, bool> >())); 
+2

ध्यान दें कि 'select1st' सी ++ मानक लाइब्रेरी का हिस्सा नहीं है। –

+0

एमएमएम। सौभाग्य से, लिखना मुश्किल है: 'टेम्पलेट स्ट्रक्चर select1st: सार्वजनिक unary_function <टी, टाइपनाम टी :: first_type> {कॉन्स टाइपनाम टी :: first_type और ऑपरेटर() (कॉन्स टी एंड एक्स) कॉन्स {वापसी x.first;}}; ' – ephemient

2

मैं वास्तव में जेम्स 'उत्तर की तरह है, लेकिन वहाँ एक अन्य विकल्प आपको विचार करना चाह सकते है - केवल std::map में सब कुछ फ़नल:

std::map<std::string, bool> myMap(v.begin(), v.end()); 

या, यदि आप नकली तार है, एक std::multimap:

std::multimap<std::string, bool> myMultiMap(v.begin(), v.end()); 

यह के रूप में के लिए हे (एन) का विरोध किया, अतिरिक्त लाभ यह है कि यदि आप तो जोड़ने या नई कुंजी/मान जोड़े को दूर करने की जरूरत है, तो आप हे (एलजी एन) में ऐसा कर सकते है क्रमबद्ध वेक्टर।

यदि आपको वास्तव में वेक्टर का उपयोग करना होगा, तो जेम्स के उत्तर के साथ जाएं। हालांकि, अगर आपके पास जोड़े का वेक्टर है, तो एक अच्छा मौका है कि आप वास्तव में std::map चाहते हैं।

+0

मुझे उस मामले पर विचार करने की आवश्यकता है जहां उपयोगकर्ता उन्हें सॉर्ट नहीं करना चाहता था और क्रम में उन्होंने उन्हें दिया था। – jmasterx

+1

भी वेक्टर + सॉर्ट अभ्यास में हो सकता है, जो कि बहुत से सामानों को एक (बहु) मानचित्र में डालने से कहीं अधिक तेज़ हो सकता है, भले ही बड़े-बड़े नोटेशन का कहना है। – Reunanen

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