मैं std::map::insert
के अर्थशास्त्र द्वारा थोड़ा उलझन में हूं। मेरा मतलब है, मैं शिकायत नहीं कर रहा हूं - मानक मानक है और एपीआई जिस तरह से है। फिर भी,सी ++ के एसडीडी मानचित्र के लिए तर्क semantics डालें?
insert
होगा
प्रत्येक तत्व डाला कि क्या एक और तत्व एक ही कुंजी मूल्य के साथ कंटेनर में पहले से मौजूद है, यदि हां, तत्व डाला जाता है और इसके मूल्य के लिए मैप किया प्रविष्टि आपरेशन के चेक किसी भी तरह से बदला नहीं है।
और - केवल अपने एकल बहस में संस्करण pair<iterator,bool> insert (const value_type& x);
यह भी आपको पता चलेगा कि यह और भी (नई संभवतः अलग-अलग) कुंजी (रों) के लिए मूल्य डाला। जहां तक मैं समझता हूं, अगर कुंजी पहले से मौजूद है तो पुनरावृत्त संस्करण चुपचाप प्रविष्टियों को अनदेखा कर देगा।
मेरे लिए, यह केवल काउंटर अंतर्ज्ञानी है, मुझे उम्मीद है कि मूल्य भाग ओवरराइट किया जाएगा और पुराने मूल्य भाग को डालने पर छोड़ दिया जाएगा। जाहिर है, एसटीएल के डिजाइनरों ने अलग-अलग विचार किया - कोई भी (ऐतिहासिक) तर्क जानता है या मौजूदा अर्थशास्त्र कैसे (अधिक) समझने के बारे में पूरी तरह से स्पष्टीकरण दे सकता है?
उदाहरण द्वारा:
ऐसे std::map
के रूप में एक एकल कुंजी के नक्शे में डालने को लागू करने के लिए कुछ बुनियादी तरीके हैं:
- डालने, की जगह पहले से ही
- डालने मौजूद रहने पर, अगर पहले से मौजूद है तो अनदेखा करें (यह std :: map का व्यवहार है)
- डालें, अगर पहले से ही त्रुटि फेंक दें
- डालने मौजूद है, यूबी अगर पहले से मौजूद है
अब मैं समझ क्यों insert_or_ignore
की तुलना में अधिक समझ में आता है कोशिश कर रहा हूँ insert_or_replace
(या insert_or_error
)!
मैं TC++PL (दुर्भाग्य से मैं केवल जर्मन संस्करण है) की मेरी कॉपी में देखा, और दिलचस्प है, Stroustrup (नक्शा के लिए सूची परिचालन) अध्याय 17.4.1.7 में लिखते हैं: (जर्मन से माफी किसी न किसी अनुवाद)
को कॉल करने से पहले ही अस्तित्व में(...) आम तौर पर, एक परवाह नहीं है कि एक प्रमुख (sic!) नव है डाला जाता है या पहले से ही
insert()
(...)
जो मुझे लगता है, केवल सेट करें, और मानचित्र के लिए नहीं, क्योंकि मानचित्र के लिए, यदि प्रदान किया गया मान डाला गया था या पुराना एक मानचित्र में रहता है तो यह काफी अंतर करता है । (यह स्पष्ट रूप से कुंजी के लिए कोई फर्क नहीं पड़ता, क्योंकि वह बराबर है।)
नोट: मैं के बारे में operator[]
जानते हैं और मैं Effective STL की मद 24 के बारे में पता है और efficientAddOrUpdate
समारोह वहाँ का प्रस्ताव रखा। मैं insert
के अर्थशास्त्र में एक तर्क के लिए उत्सुक हूं क्योंकि मैं व्यक्तिगत रूप से उन्हें सहज ज्ञान युक्त पाते हैं।
ठीक है, आपने इसे मौजूदा मान को संशोधित करने के लिए नहीं कहा था, आपने इसे एक (नया) मान डालने के लिए कहा था। मैं मानता हूं कि रिपोर्टिंग विफलता अधिक लगातार एक अच्छी बात होगी। आप अभी भी लौटाए गए पुनरावर्तक को अस्वीकार कर सकते हैं और जांच सकते हैं कि नया मान या पुराना कोई मौजूद है या फिर मौजूदा मान को अपडेट करने के लिए उस इटरेटर का उपयोग भी करें। –
यदि आप प्रतिस्थापित/बनाना चाहते हैं, तो 'ऑपरेटर [] 'का उपयोग करें। – BoBTFish
यहां कुछ कोड है ["बलपूर्वक डालें"] (http://stackoverflow.com/a/8337563/596781) मानचित्र में। –