2009-07-01 14 views
6

में मानों के संदर्भों को संग्रहीत करना क्या मैं यह मानने में सही हूं कि std :: मानचित्र में तत्व जोड़ना/निकालना अन्य तत्वों को प्रभावित नहीं करता है (यानी उन्हें स्मृति में स्थानांतरित किया जाता है) और निम्न में निम्न सुरक्षित है:सी ++ std :: मान

मैं कंटेनर पर जानकारी के साथ विभिन्न साइटों को देखा है, लेकिन केवल मामलों में जहां iterators अवैध कर रहे हैं, जो मैं पहले से ही पता बारे में पता चला ...

std::map<std::string,std::string> map; 
PopulateMap(map); 
std::string &a= map["x"]; 
AddMoreData(map); 
RemoveRandomKeysExceptX(map); 
map["x"] = "foo"; 
std::cout << a << " " << map["x"] << std::endl;//prints "foo foo" 
a = "bar"; 
std::cout << a << " " << map["x"] << std::endl;//prints "bar bar" 

मैं VC9 पर कुछ इसी तरह कोड का परीक्षण किया , जो काम करने लगता है हालांकि इसका मतलब यह नहीं है कि मैं सिर्फ भाग्यशाली नहीं था या यह संकलकों में भिन्न नहीं है।

+0

सुनिश्चित नहीं है कि आपने अपना उत्तर नाडेन क्यों हटा दिया है, यह सही था जहां तक ​​मैं देख सकता था। – CiscoIPPhone

+0

नवीन का जवाब इटरेटर के बारे में था, जो यह प्रश्न –

+0

नहीं है, मैंने अपना जवाब भी हटा दिया है, क्योंकि दूसरे पढ़ने पर मैं पूरी तरह अस्पष्ट हूं कि वास्तविक सवाल क्या है। –

उत्तर

8

स्टैंडर्ड साहचर्य कंटेनरों

डालने सदस्यों iterators और कंटेनर के लिए संदर्भ की वैधता को प्रभावित नहीं करेगा के बारे में 23.1.2/8 में इस पर स्पष्ट है, और मिटा सदस्यों केवल iterators और संदर्भ को अमान्य नहीं होगी मिटाए गए तत्वों के लिए।

+0

+1। मुझे मानक की एक प्रति हाथ पर रखने की जरूरत है। मेरा जवाब अधिक संक्षिप्त और निश्चित हो सकता था। – CiscoIPPhone

+0

हाँ, हमेशा एक अच्छा विचार है कि ओकुलर/एक्रोराड ओपन का उदाहरण रखें ताकि आप जल्दी से सामान ढूंढ सकें =) इस मामले में, मुझे यहां हुई चर्चा याद आई: http://stackoverflow.com/questions/516007/stdmap- पॉइंटर-टू-मैप-की-वैल्यू-इज़-यह-संभव =) –

+0

मैं आपको @ ग्रेग-रॉगर्स के उत्तर को ऊपर उठाने के लिए प्रोत्साहित करता हूं। क्योंकि यह सही है, जाहिर है, जबकि स्वीकृत उत्तर कहता है कि आप इस बारे में सुनिश्चित नहीं हो सकते हैं। लेकिन मानक बहुत स्पष्ट है कि पॉइंटर्स वैध रहते हैं। –

3

मानचित्र में महत्वपूर्ण तत्व है जो मानचित्र में एक नया तत्व डालने से मौजूदा तत्वों को इंगित करने वाले इटरेटर्स को अमान्य नहीं करता है। उद्धरण sgi docs से लिया गया।

यदि इटरेटर को बदलने की गारंटी नहीं है तो वे जो मूल्य इंगित करते हैं वे भी बदल नहीं सकते हैं।

नवीन पहले एक उत्तर था जो इस तरह के समान था। जब तक मेरे तर्क में कोई गलती न हो कि आप क्या कर रहे हैं सुरक्षित है।

संपादित करें 2: ऑपरेटर से मूल्य प्राप्त करने के तरीके को देखने के लिए sgi docs में बिंदु 3 देखें [] एक पुनरावर्तक से मूल्य प्राप्त करने जैसा ही है।

+1

जैसा कि मैंने नवीन (नडेन) , सवाल iterators के बारे में नहीं है। –

+0

मुझे एहसास है, लेकिन ऑपरेटर [] iterators का उपयोग करता है। – CiscoIPPhone

+0

ध्यान दें कि एसजीआई दस्तावेज़ों के पास कभी-कभी मानक लाइब्रेरी में छोटे विवेकाधिकार होते हैं, जब विवरणों की बात आती है। –

0

हाँ आप इस पर भरोसा कर सकते हैं।

// retrieve reference to string stored at "x" 
// note that since [] returns a reference, it must insert an element at "x" if 
// it doesn't exists (in this case an empty string) 
std::string &a= map["x"]; 

// retrieve reference for "x" again and set value to "foo" 
map["x"] = "foo"; 

// use already stored reference 
a = "bar"; 
संबंधित मुद्दे