2010-10-07 20 views
7

को देखते हुएकैसे std :: नक्शा कंटेनर

std::map<int,std::string> myMap; 
fillMyMapWithStuff(myMap); 

// modify key values - I need to add a constant value to each key 
for (std::map<int,std::string>::iterator mi=myMap.begin(); mi != myMap.end(); ++mi) 
{ 
    // ... 
} 

में कुंजी मान को संशोधित करने के क्या एक अच्छा तरीका कुछ फिर से अनुक्रमण लागू होते हैं? क्या मुझे पुरानी प्रविष्टि को हटा देना चाहिए और नई कुंजी और पुराने मूल्य के साथ एक नया जोड़ना चाहिए?

उत्तर

8

ऐसा लगता है कि आप एक नया नक्शा बनाने और इसे बाद में स्वैप करने से बेहतर हैं। आपके पास n हटाने और n सम्मिलन के बजाय केवल n सम्मिलित संचालन होंगे।

+0

+1, इस मामले में, जब पूरा नक्शा पुनर्निर्मित किया जाता है, तो यह संकेत से भी बेहतर है + संकेत के साथ सम्मिलित करें। – Cubbi

+0

निष्पक्ष होने के लिए, इसके एन सम्मिलित संचालन + 1 स्वैप ऑपरेशन। – Justicle

+0

@ जस्टिन: लेकिन एक स्वैप को अर्थहीन समय लेना चाहिए। –

3

हां, आपको अवश्य ही चाहिए। जब यह मानचित्र में होता है तो कुंजी स्थिर होती है।

5

हां, आपको पुरानी प्रविष्टि को हटाना होगा और नई कुंजी के साथ एक नया जोड़ना होगा। कुंजी संशोधित नहीं हैं।

यदि आप केवल एक या कुछ तत्वों को संशोधित कर रहे थे, तो आप नए तत्व की स्थिति के साथ map::insert को संकेत देकर कुशलता से ऐसा कर सकते हैं। चूंकि आपकी नई कुंजी पुरानी कुंजी के बाद कहीं भी स्थित होने के लिए सुनिश्चित हैं, तो आप पुराने तत्व पर इंगित करने वाले इटरेटर के साथ संकेत दे सकते हैं। हालांकि, आपको सावधानी बरतनी होगी कि ताज़ा-डाली गई कुंजियों का पुन: मूल्यांकन न करें (उदाहरण के लिए सामने के अंत तक), और पूरे मानचित्र को संशोधित करने के मामले में, यह केवल एक नया निर्माण करने के लिए अधिक कुशल है।

2

मुझे लगता है कि आपको एक नया नक्शा बनाना होगा। यदि आप लूप के भीतर नई कुंजियों को हटाते हैं और जोड़ते हैं, तो यह पुराने कुंजियों के सेट पर पुनरावृत्ति की अखंडता को नष्ट कर सकता है, और केवल डाली गई कुंजी को स्पर्श नहीं कर सकता है। (जब तक आप नहीं जानते कि आपकी चाबियाँ कैसे वितरित की जाती हैं और वहां अपना तर्क डालती हैं।)

std::map<int,std::string> myMap; 
fillMyMapWithStuff(myMap); 

std::map<int,std::string> newMap; 

// modify key values - I need to add a constant value to each key 
for (std::map<int,std::string>::iterator mi=myMap.begin(); mi != myMap.end(); ++mi) 
{ 
    newMap[mi->first] = mi->second; 
} 
2

एक और विकल्प है। यदि यह ऑपरेशन आपके संग्रह की एक महत्वपूर्ण विशेषता है, और प्रदर्शन महत्वपूर्ण है, तो आप मानचित्र को पूरी तरह कॉपी करने से बच सकते हैं। आप operator[], साथ ही साथ अन्य एक्सेसर्स और म्यूटेटर को ओवरलोडिंग कर सकते हैं, और मुख्य मान की वर्तमान शिफ्ट जोड़ सकते हैं।

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