2010-08-05 27 views
7

मुझे std::list< std::pair<std::string,double> > मिला है, जो मुझे पता है std::string element के अनुसार क्रमबद्ध है।std :: जोड़ी की एक क्रमबद्ध std :: सूची को कैसे परिवर्तित करें :: std :: map

जब से मैं std::string तत्व के आधार पर std::find_if का एक बहुत करना चाहते हैं, मेरा मानना ​​है कि lower_bound और upper_bound के साथ एक std::map<string,double,MyOwnBinaryPredicate> अधिक पर्याप्त होगा।

तथ्य यह है कि मैं में insert तत्वों को एक कुशल तरीके से बनाना चाहता हूं। तो मैं insert तेज बनाने के लिए एक अतिरिक्त पुनरावर्तक का उपयोग करना चाहता हूं।

मेरा मानना ​​है कि सबसे आसान तरीका है एक const_reverse_iterator उपयोग करने के लिए std::list के माध्यम से जाना और std::map की begin() उपयोग करने के लिए किया जाएगा।

क्या आप इसे इस तरह से करेंगे, या यह एक बुरा विचार है?

धन्यवाद! क्योंकि एक सूची < जोड़ी के लिए iterator> संगत एक मान प्रकार < X, Y> के iterators मैप करने के लिए है

std::copy(the_list.begin(),the_list.end(),std::inserter(the_map,the_map.begin())); 

:

+0

[C++] न रखें शीर्षक पर:

आप बाद में परिणामों को अपनी सूची में वापस चाहते हैं तो आप सिर्फ विपरीत कर सकता है। यही टैग है। – NullUserException

+0

grddev और लूथर ब्लिसेट द्वारा प्रदान किए गए उत्तरों के साथ, मेरे शुरुआती सुझाव ('प्रारंभ()' का उपयोग करके, 'अंत() ') का उपयोग करने के समान ही प्रदर्शनों के बारे में है। हालांकि, दोनों संक्षिप्त हैं। मैं अपनी सादगी के लिए grddev का जवाब स्वीकार करता हूं, लेकिन मैं 'std :: inserter' को ध्यान में रखता हूं। आप सभी को धन्यवाद! – Wok

उत्तर

11

आप पहले से ही एक क्रमबद्ध सूची है, जो विधेय Predicate के अनुसार क्रमबद्ध किया जाता है है, तो आप निम्नलिखित सिर्फ कर सकते हैं (एन * लॉग एन) अन्यथा। फिर आप मानचित्र के साथ सीधे काम कर सकते हैं जैसा कि आप किसी और के साथ करेंगे।

sorted_list.assign(map.begin(), map.end());
+3

+1: मैं सॉर्ट किए गए रैखिक सीटीआर के बारे में भूल गया। महान! –

+0

इस उत्तर का लाभ इसकी सादगी है। धन्यवाद! – Wok

4

आप std :: कॉपी और std :: Inserter उपयोग कर सकते हैं।

+0

std :: inserter()? अच्छी तरह से आप रोज़ाना कुछ नया सीखते हैं :) –

+1

+1: यह समान प्रदर्शन करता है और मौजूदा मानचित्र के साथ भी काम करता है – grddev

+0

'std :: inserter (the_map, the_map.begin()) 'या' std :: inserter (the_map का उपयोग कर रहा है) , the_map.end()) 'बेहतर यहां दिया गया है, यह देखते हुए कि सूची क्रमबद्ध है? – msandiford

0

मैं सिर्फ सूची में पुन: प्रयास करता हूं और प्रत्येक जोड़ी को मानचित्र में डालता हूं या साफ विधि का उपयोग करता हूं लूथर ब्लिसेट ने वर्णित किया है।
तथ्य यह है कि मुझे वह नहीं मिलता है जो आप करने का प्रयास कर रहे हैं इसका मतलब है कि यह या तो अपठनीय कोड में होगा या आप रास्ते से बाहर हो जाएंगे।
आप इसे इस तरह क्यों कर रहे हैं?
क्या आप पहली जगह में किसी सूची की बजाय मानचित्र को वापस करने के लिए कोड बदल सकते हैं?

std::list< std::pair<std::string, double> > sorted_list; 
std::map<string, double, Predicate> map(sorted_list.begin(), sorted_list.end()); 

map निर्माता रैखिक समय जटिलता अगर अपनी सूची पहले से ही क्रमबद्ध हो जाता है है, हे:

+0

मुझे पहले स्थान पर एक std :: सूची का उपयोग करना है, क्योंकि ऐसे तत्व हैं जिनमें एक ही std :: string key है। फिर ऐसे ऑपरेशन हैं जो मुझे अंत में एक std :: मानचित्र का उपयोग करने देते हैं। मैं प्रक्रिया में थोड़ा पहले एक std :: मानचित्र का उपयोग करने पर विचार कर सकता हूं, लेकिन सवाल इस मामले में अभी भी प्रासंगिक है। – Wok

+0

क्या आपने std :: multimap का उपयोग करने पर विचार किया है? यहां देखें: http://www.sgi.com/tech/stl/Multimap.html –

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