Tuesday 15 July 2014

c++ - What happened when call std::map's operator[] or insert -


मेरे पास निम्न कोड है:

  #include & lt; functional & gt; // std :: less # शामिल करें & lt; नक्शा & gt; # शामिल करें & lt; iostream & gt; नेमस्पेस एसटीडी का उपयोग करना; वर्ग कुंजी {सार्वजनिक: कुंजी () {cout & lt; & lt; "कुंजी निर्माता" & lt; & lt; Endl;} ~ कुंजी () {cout & lt; & lt; "कुंजी विध्वंसक" & lt; & lt; एंडल;} कुंजी (कॉन्स्ट की और कुंजी) {cout & lt; & lt; "कुंजी कॉपी निर्माता" & lt; & lt; एंडल;} बूल ऑपरेटर & lt; (कॉन्स्ट की और amp; के 1) {वापसी सच;}}; Int main () {map & lt; कुंजी, int & gt; mymap; कुंजी कश्मीर; Cout & lt; & lt; "ऑपरेटर []" & lt; & lt; endl; माइमप [के] = 1; मानचित्र & lt; कुंजी, इंट & gt; mymap2; Cout & lt; & lt; "सम्मिलित" & lt; & lt; endl; Mymap2.insert (std :: make_pair (k, 1)); Cout & lt; & lt; "=========" & lt; & lt; endl; }   

और आउटपुट है:

  $ g ++ test.cpp -fpermissive $ ./a.out कुंजी कन्स्ट्रक्टर ऑपरेटर [] कुंजी कॉपी निर्माता कुंजी कॉपी कन्स्ट्रक्टर कुंजी डिस्ट्रक्टर इनर कुंजी कॉपी कन्स्ट्रक्टर कुंजी कॉपी कन्स्ट्रक्टर कुंजी कॉपी कन्स्ट्रक्टर कुंजी कॉपी कन्स्ट्रक्टर कुंजी डिस्ट्रक्टर कुंजी डिस्ट्रक्टर कुंजी डिस्ट्रक्टर ========= कुंजी डिस्ट्रक्टर कुंजी डिस्ट्रक्टर कुंजी डिस्ट्रक्टर   

क्या कोई भी कृपया बताएं कि मैमप [के] = 1; 2 कॉपी निर्माता और mymap2.insert को प्रारंभ करें (std :: make_pair (k, 1)); 4 कॉपी निर्माता का आह्वान करता है?

सारांश:

धन्यवाद उपयोगकर्ता 6502 और आपकी अंतर्दृष्टि के लिए पेटर्सहॉं, अब मुझे लगता है कि सम्मिलित करने के लिए 2 अतिरिक्त प्रतिलिपि कन्स्ट्रक्टर का कारण नीचे है:

  • एक फ़ंक्शन है, यह पहले फ़ंक्शन के भीतर एक प्रति बना लेता है, और फिर प्रतिलिपि वापस करता है - यह एक अतिरिक्त प्रतिलिपि है
  • मेक-पेयर (कश्मीर, 1) एक जोड़ी और लेफ्टिनेंट; कुंजी, इंटैग्रेड; बनायेगा, लेकिन जरूरी है जोड़ी & lt; const & amp;

    (स्टडी :: जोड़ी और लेफ्टिनेंट; कॉन्स्ट की, इंट एट (जी, 1));

    कॉल कन्स्ट्रक्टरों की संख्या को ऑपरेटर के साथ मिलते हैं []

    जैसा कि 6502 नोट किया गया है, इसलिए इसे सही नहीं बदला गया है:

    इस फ़ंक्शन के लिए कॉल (ऑपरेटर []) के समतुल्य है: (* ((-- (- (- (एक्स, मैप_प्रकार ())))) पहले))। दूसरा

    ऑपरेटर [] make_pair ()

    <पी द्वारा पेश अतिरिक्त प्रतिलिपि से बचने के लिए अलग-अलग कार्यान्वित किया जाता है > डालने के साथ समस्या यह है कि make_pair गलत प्रकार की एक जोड़ी बनायेगी ताकि पारित ऑब्जेक्ट को सम्मिलित करें को पारित करने के लिए उचित जोड़ी प्रकार में रूपांतरण की आवश्यकता होगी। < / P>

    असल में एक पूर्व संस्करण में सी ++ मानक अनिवार्य मैप :: ऑपरेटर [] के रूप में व्यवहार करने के लिए insert (इस प्रकार एक अक्षम कार्यान्वयन को मजबूर कर रहा है) बाद में पाठ को बेहतर कार्यान्वयन की इजाजत दी गई।

    ध्यान दें कि मानक कंटेनरों के लिए तत्व को "मूल्य" माना जाता है, अर्थात् कार्यान्वयन को चीजों की प्रतिलिपि बनाने के लिए स्वतंत्र है और आपको इसके बारे में कोई गारंटी नहीं है कि कितने प्रतिलिपियां बनाई जाएंगी।

    आप कोड को

      mymap2.insert (std :: pair & lt; const) में बदल कर  make_pair  समस्या देख सकते हैं। कुंजी, एट एंड जी; (के, 1));   

    लंबा विवरण

    समस्या यह है कि make_pair एक std :: pair और lt; key, int & gt; मान लेकिन डालें हस्ताक्षर इसके बजाय एक const std :: pair और lt; const कुंजी, int & gt; & amp; (ध्यान दें कि std :: map :: value_type एक const पहला तत्व) के साथ एक जोड़ी है।

    ये दो प्रकार असंगत हैं और इसलिए असंबंधित हैं कि कॉल करने में सक्षम होने के लिए एक और जोड़ी दोनों की नकल होनी चाहिए मान और यह वह जगह है जहां एक अतिरिक्त कुंजी दोहराव होता है।

    भले ही यह स्पष्ट रूप से "तार्किक" हो सकता है कि एक जोड़ी और एलटी; एक्स, वाई & gt; जोड़ी और लेफ्टिनेंट; कॉन्स्ट एक्स, वाई & gt; अपेक्षा की जाती है कि यह सी ++ में सत्य नहीं है और यह कॉन्स्ट-क्लीटेनेस अवधारणा (यह संरचना द्वारा स्केल नहीं करता है) की तार्किक समस्याओं में से एक है।

No comments:

Post a Comment