क्या std::map
नए डेटा डालने पर मान के आसपास पहले से डाला गया है?std :: नक्शा और पहले से डाले गए डेटा का व्यवहार
उत्तर
नक्शा एक पेड़ के रूप में लागू किया गया है, और जब आप एक नया तत्व डालते हैं, तो पेड़ को पुन: संतुलित करने की आवश्यकता हो सकती है।
यह पेड़ में तत्वों के किसी भी इटरेटर या संदर्भ को अमान्य करता है। यह संतुलन पॉइंटर्स के हेरफेर के माध्यम से किया जाता है, इसलिए आपके पास चिंता करने की कोई बात नहीं है; नोड खुद ही रहते हैं।
संतुलन में नोड्स को बताकर पेड़ की संरचना को बदलना शामिल है, जो उनके बच्चे, माता-पिता और भाई बहन फिर से असाइन करने वाले पॉइंटर्स के माध्यम से होते हैं, लेकिन यह एक कार्यान्वयन विस्तार है। तार्किक रूप से कुछ भी नहीं बदला है।
मानक एसटीएल के विशिष्ट कार्यान्वयन, केवल व्यवहार और रनटाइम विशेषताओं को अनिवार्य नहीं करता है। उस ने कहा, एक स्किप सूची या पेड़ std :: मानचित्र का एक बहुत ही संभावित कार्यान्वयन है, इसलिए लिंक अपडेट हो जाएंगे, और सापेक्ष आदेश बदल जाएगा, लेकिन वास्तविक डेटा चारों ओर घूमने वाला नहीं है।
template <class T>
struct Node
{
Node* mPrevious;
Node* mNext;
T mValue;
};
जब दो मौजूदा बीच एक नए नोड डालने, तुम सब करने की ज़रूरत कुछ rewiring है:
दोगुना लिंक्ड सूची में एक ठेठ नोड पर विचार करें।
void insert(Node* target, Node* newNode)
{
target->mPrevious->mNext = newNode;
target->mPrevious = newNode;
newNode->mPrevious = target->mPrevious;
newNode->mNext = target;
}
व्यवहार के साथ इसी तरह की है एक std::map
(या std::set
, std::multimap
या std::multiset
बाद से वे सभी सामान्य रूप में एक ही अंतर्निहित संरचना का उपयोग करके लागू)।
इसका मतलब है कि मौजूदा तत्व को इंगित करने वाला कोई भी इटरेटर भी वैध रहता है। मैं मौजूदा तत्व बिट पर जोर देता हूं। end
द्वारा लौटाए गए इटरेटर को सम्मिलन या हटाने के बाद पुनः संयोजित किया जाना चाहिए और बेहतर कैश नहीं किया जाना चाहिए।
सी ++ मानक std::map
के कार्यान्वयन को केवल इसके व्यवहार और दक्षता को लागू नहीं करता है। कार्यान्वयन के आसपास वस्तुओं को स्थानांतरित करने की अनुमति है; हालांकि, यह अक्षम हो सकता है।
अधिकांश std::map
कंटेनरों को लिंक के साथ एक पेड़ डेटा संरचना का उपयोग करके कार्यान्वित किया जाता है। आइटम डालने या पुन: व्यवस्थित करते समय, लिंक बदल जाते हैं, लेकिन डेटा स्थानांतरित नहीं होता है। चलती वस्तुओं std::map
के निष्पादन समय को धीमा कर देगी।
- 1. कॉपी std :: नक्शा डेटा एक और नक्शा
- 2. std :: नक्शा डालने या std :: नक्शा ढूंढें?
- 3. कैसे std :: नक्शा कंटेनर
- 4. std :: वेक्टर और std :: मिनट व्यवहार
- 5. सी ++: std :: नक्शा
- 6. std :: नक्शा डिफ़ॉल्ट मान
- 7. सी ++ कॉन्स std :: नक्शा संदर्भ
- 8. std :: async (std :: launch :: async) बनाम जीसीसी का व्यवहार बनाम क्लैंग का व्यवहार
- 9. छँटाई :: नक्शा जहां कुंजी एक std :: स्ट्रिंग
- 10. पंक्तियों का चयन करें जो अभी डाले गए हैं
- 11. Matplotlib - पहले से ही पिन किए गए डेटा
- 12. ggplot2 + दुनिया का नक्शा = पुराना डेटा?
- 13. std :: नक्शा एक कुंजी, दो मान
- 14. टेबललेआउट के भीतर डाले गए डॉक किए गए नियंत्रण स्वचालित रूप से उनके निर्माण आकार
- 15. डाले गए या हटाए गए मानों को कैप्चर करने के लिए SQL डेटा रीडर का उपयोग करना
- 16. नक्शा
- 17. std :: नक्शा परिवर्तन key_comp प्रारंभ करने के बाद
- 18. WCF ServiceHost पहले से ही 5 व्यवहार
- 19. नक्शा एसटीडी पर :: नक्शा अमान्य टेम्पलेट तर्क <std :: स्ट्रिंग, स्टॉक *> और शेयरों
- 20. ओरेकल - नए डाले गए कुंजी मान को वापस करें
- 21. बदलने से पहले में डेटा
- 22. एसटीडी के व्यवहार :: std :: लांच :: async नीति
- 23. std :: नक्शा मानक आवंटन प्रदर्शन बनाम ब्लॉक आवंटक
- 24. नक्शा
- 25. क्लोजर आलसी नक्शा से आलसी नक्शा
- 26. Emacs में डाले गए, एकाधिक फ़ाइलों को कैसे ढूंढें/देखें?
- 27. क्या यह std :: सरणी अपरिभाषित व्यवहार का उपयोग है?
- 28. सभी पहले से खोले गए बच्चे विंडोज़
- 29. एक std :: नक्शा कंटेनर जैसे मानचित्र जो मानों के प्रकार
- 30. `std :: list` के 'end()` को मिटाने का व्यवहार क्या है?
मुझे आश्चर्य है, अगर यह एक तत्व के लिए एक पुनरावर्तक है, तो प्रविष्टि से पहले और उसके बाद '* यह 'उसी मानचित्र प्रविष्टि को संदर्भित करता है लेकिन क्या यह गारंटी है कि' & * यह वही रहता है? अधिकांश कार्यान्वयन में मैं यह सच होने की अपेक्षा करता हूं, लेकिन पर्याप्त प्रोक्सिंग के साथ एक इटरेटर को कार्यान्वित करना संभव होगा कि तत्व चारों ओर घूम सकते हैं लेकिन इटेटरेटर स्थिरता बनाए रखते हैं। –
@ चार्ल्स 23.1.2/8 यह भी बताता है कि कंटेनर के लिए कोई संदर्भ अमान्य नहीं है। –
@ चार्ल्स: अच्छा सवाल, मैंने कभी इसके बारे में सोचा नहीं। उत्तर के लिए धन्यवाद @Andreas। – GManNickG