2016-09-10 4 views
8

मैं std::map के मौजूदा इंटरफ़ेस का आदी हूं।
तत्वों को सम्मिलित करना सफल प्रविष्टि का वर्णन करने वाला एक बूल देता है,
साथ ही इटरेटर जहां सम्मिलित तत्व होगा।मैं stode :: map :: insert के साथ node_type का उपयोग कब करूं?

template< class P > 
std::pair<iterator,bool> insert(P&& value); //(since C++11) 

सी ++ 17 कहते हैं क्या एक समान कॉल होने के लिए है, लेकिन विभिन्न प्रकार के नामों के साथ:

insert_return_type insert(node_type&& nh); //(since C++17) 

मैं देख क्या एक node_type है की कोशिश की है, लेकिन यह मुख्य रूप से अनिर्दिष्ट है:

template</*unspecified*/> 
class /*unspecified*/ 

यह फ़ंक्शन सी ++ 17 में क्यों जोड़ा गया था, और मैं इसे पुराने कॉल पर कब उपयोग करूंगा?

उत्तर

7

यह सिर्फ std::map, समान कार्य सभी साहचर्य और अव्यवस्थित साहचर्य कंटेनरों में जोड़ा गया है नहीं है। वे [container.node]/1

में मानक से वर्णन किया गया एक नोड संभाल एक वस्तु है कि एक साहचर्य कंटेनर (23.2.4) या एक अव्यवस्थित साहचर्य कंटेनर (23.2.5) से एक भी तत्व के स्वामित्व को स्वीकार करता है। इसका उपयोग संगत नोड्स के साथ किसी अन्य कंटेनर पर स्वामित्व को स्थानांतरित करने के लिए किया जा सकता है। संगत नोड्स वाले कंटेनर में एक ही नोड हैंडल प्रकार होता है। ...

उपरोक्त अनुभाग के बाद तालिका संगत नोड्स वाले कंटेनरों को दिखाती है।

क्या नोड हैंडल इंटरफ़ेस आपको तत्वों की प्रतिलिपि/स्थानांतरित किए बिना एक कंटेनर से दूसरे (संगत) कंटेनर में स्थानांतरण तत्व (नोड्स) करने की अनुमति देता है। इसके बजाय, कंटेनर द्वारा बनाए गए व्यक्तिगत आंतरिक नोड्स को पूरी तरह से स्थानांतरित किया जाता है।

एक कंटेनर से निपटने के दौरान यह आवश्यक हो जाता है जिसमें गैर-प्रतिलिपि रहित, गैर-चलने योग्य प्रकार होता है।

5

आप अपने extract() फ़ंक्शन का उपयोग करके std::map से एक नोड प्राप्त कर सकते हैं। फिर आप उस नोड को किसी अन्य मानचित्र में डाल सकते हैं (या अपनी कुंजी बदलने के बाद उसी मानचित्र में)।

node_type extract(const_iterator position); (1) (since C++17) 
node_type extract(const key_type& x);  (2) (since C++17) 

1) नोड तत्व स्थिति द्वारा की ओर इशारा किया है और एक नोड संभाल कि यह
2 का मालिक) कंटेनर x की कुंजी बराबर के साथ एक तत्व है, तो रिटर्न कि अनलिंक, अनलिंक नोड जिसमें कंटेनर से तत्व है और का स्वामित्व वाला नोड हैंडल देता है। अन्यथा, एक खाली नोड हैंडल देता है।

या तो मामले में, कोई तत्व नकल या ले जाया जाता है, केवल आंतरिक कंटेनर नोड्स के संकेत दिए गए repointed कर रहे हैं (पुनर्संतुलन हो सकता है, मिटा के साथ के रूप में()) एक नोड निकाला जा रहा है निकाले तत्व को iterators अमान्य हो जाएगा। निकाले गए तत्व के पॉइंटर्स और संदर्भ वैध रहते हैं, लेकिन इसका उपयोग नहीं किया जा सकता है, जबकि तत्व का नोड हैंडल के स्वामित्व में है: यदि तत्व कंटेनर में डाला गया है तो वे प्रयोग योग्य हो जाते हैं।

उदाहरण:

map<int, string> m{{1,”mango”}, {2,”papaya”}, {3,”guava”}}; 
auto nh = m.extract(2); 
nh.key() = 4; 
m.insert(move(nh)); 
// m == {{1,”mango”}, {3,”guava”}, {4,”papaya”}} 
संबंधित मुद्दे