2009-11-27 19 views
6

के पहले n तत्व कैसे प्राप्त करें क्योंकि C++ std :: मैप में कोई .resize() सदस्य फ़ंक्शन नहीं है, मैं सोच रहा था कि कोई व्यक्ति std :: मानचित्र को अधिकांश एन तत्वों के साथ कैसे प्राप्त कर सकता है ।std :: map

स्पष्ट समाधान 0 से n तक लूप बनाना और nd iterator का उपयोग std :: erase() के लिए पहले पैरामीटर के रूप में करना है।

मैं सोच रहा था कि कोई समाधान है जिसके लिए लूप की आवश्यकता नहीं है (कम से कम मेरे उपयोगकर्ता कोड में नहीं) और अधिक "एसटीएल रास्ता जाने" है।

+1

हम्म .. मैं कहता हूं कि एक इटरेटर लूप * है * एसटीएल रास्ता जाने का तरीका है, है ना? – schnaader

+2

कोई 'std :: erase' नहीं है। 'Std :: map <कुंजी, वैल, प्राइड, एलोक> :: मिटाएं()' –

उत्तर

13

आप इसके लिए std::advance(iter, numberofsteps) का उपयोग कर सकते हैं।

+0

+1 - उसे नहीं पता था - अच्छा है। – schnaader

0

आप मानचित्र का आकार क्यों बदलना चाहते हैं?

मानचित्र में तत्वों को किसी भी क्रम में संग्रहीत नहीं हैं - पहली 'एन' वास्तव में कुछ मतलब नहीं

संपादित करता है:
दिलचस्प बात यह है std :: नक्शा एक आदेश है, यकीन नहीं कैसे उपयोगी यह अवधारणा है।
क्या कुंजी के समान क्रम में प्रविष्टियां हैं?
इसका क्या अर्थ है? यदि आपके पास एसएसएन द्वारा कुंजी नाम हैं तो क्या इसका मतलब है कि नाम एसएसएन संख्यात्मक क्रम में संग्रहीत हैं?

+0

कुंजी का ऑर्डर करने वाले तत्व नहीं हैं? –

+0

आपके विचार के तरीके में नहीं, तत्व स्मृति में कुछ क्रम में हैं। एक हैश एल्गोरिदम है जो कुंजी को इंडेक्स में परिवर्तित करता है। लेकिन key1 और key2 के तत्व एक दूसरे के बगल में जरूरी नहीं हैं। –

+3

@mgb नहीं, यह हैश तालिका होगी। एक std :: नक्शा एक बाइनरी खोज पेड़ है (आमतौर पर एक लाल-काला पेड़ विशिष्ट होना चाहिए)। इसलिए std :: मानचित्र में तत्व इस तरह से संग्रहीत होते हैं जो क्रमशः आसान और तेज़ क्रम में पुनरावृत्ति करता है। – Tim

1

एक std :: नक्शा एक सूची नहीं है। कोई "पहला एन" तत्व नहीं हैं।

बीटीडब्ल्यू: कंटेनर बदल गया है तो Iterators अमान्य हो जाते हैं।

यदि आपको वास्तव में एक छोटे से मानचित्र की आवश्यकता है तो आप इसे फिर से सक्रिय कर सकते हैं और सभी तत्वों को एन-थ तक नए मानचित्र में जोड़ सकते हैं।

+3

ठीक है, तत्वों को उनकी कुंजी द्वारा क्रमबद्ध किया जाता है, है ना? – Nailer

+0

@ नाइलर: अच्छा, मुझे यह नहीं पता था। यह लिंक पुष्टि करता है: http://www.cplusplus.com/reference/stl/map/ – ya23

+1

हां, वे हैं। लेकिन एक नक्शा "सबसे अधिक संभावना नोड्स के एक (संतुलित) पेड़ के रूप में लागू किया जाता है" (उद्धरण "सी ++ प्रोग्रामिंग भाषा", बजेर्न स्ट्राउस्ट्रप), सूची नहीं। तो mymap [n] कोई समझ नहीं आता है। – EricSchaefer

3

लगभग किसी भी कंटेनर के लिए सार्वभौमिक समाधान, जैसे std :: list, std :: map, boost :: multi_index। आपको केवल अपने मानचित्र का आकार ही देखना होगा।

template<class It> 
It myadvance(It it, size_t n) { 
    std::advance(it, n); 
    return it; 
} 

template<class Cont> 
void resize_container(Cont & cont, size_t n) { 
    cont.erase(myadvance(cont.begin(), std::min(n, cont.size())), 
       cont.end()); 
} 
+0

यह शून्य है std :: अग्रिम(), इसलिए यह संकलित नहीं हुआ। – Norbert

+0

दाएं। मेने ठीक कर दिया। –

+0

+1, लेकिन अगर आप इसे रिलीज के लिए तैयार कर रहे थे तो आपको अपना दिमाग बनाना होगा कि 'resize_container' किस अवधारणा पर चल रहा है। फ़ंक्शन और टेम्पलेट पैरामीटर नाम किसी भी कंटेनर का सुझाव देते हैं। फ़ंक्शन पैरामीटर नाम किसी भी मानचित्र का सुझाव देता है। जैसा कि लिखा गया है, मुझे लगता है कि यह वास्तव में किसी भी अनुक्रम या सहयोगी कंटेनर पर काम करेगा, दुर्भाग्यवश इसका अर्थ है कि इसका डोमेन सी ++ वर्गीकरण में एक पॉलीफायलेटिक समूह है। –

1

इसका सही तरीका std :: अग्रिम का उपयोग करना है। लेकिन यहां एक मजाकिया (धीमा) तरीका है जो 'मानचित्र पर आकार बदलने का उपयोग करने' की इजाजत देता है। अधिक आम तौर पर, इस प्रकार की चाल का उपयोग वेक्टर पर काम करने वाली अन्य चीजों के लिए किया जा सकता है लेकिन मानचित्र पर नहीं।

map<K,V> m; //your map 
vector< pair<K,V> > v(m.begin(), m.end()); 
v.resize(n); 
m = map<K,V>(v.begin(),v.end()); 
संबंधित मुद्दे