इस मामले में वहाँ, "मूल्य-प्रकार" std::pair
के कुछ हिस्सों emplacing std::string
के रूप में छोटे से बिंदु है दोनों कुशलता से एक सी स्ट्रिंग से परिवर्तित किया जा सकता है, और यह कर सकते हैं मानचित्र में कुशलता से स्थानांतरित हो। सरल m.emplace(3, std::make_pair("bob", "alice"))
और आप इष्टतम दक्षता के 99% रास्ते हैं।
हालांकि, अगर आप एक std::map
कि एक प्रकार है कि कुशलता से इस तरह का निर्माण नहीं किया जा सकता करने के लिए नक्शे है, सी ++ 11 std::piecewise_construct
std::pair
के लिए होने के लिए emplace
घ प्रदान करता है।
struct A { }; // nothing
struct C { C(C&&)=delete; }; // no copy/move
struct B { B()=delete; B(B&&)=delete; B(C&&, C&&) {}; }; // no copy/move, only annoying ctor
std::map< int, std::pair<A,B> > test;
// test.emplace(0, std::make_pair(A{}, B{}); // does not compile
// test.emplace(0, std::make_pair(A{}, B{C{},C{}}); // does not compile
test.emplace(std::piecewise_construct,
std::make_tuple(0),
std::forward_as_tuple(
std::piecewise_construct,
std::forward_as_tuple(A{}),
std::forward_as_tuple(C{}, C{})
)
); // compiles!
live example
यह एक कठोर कोने मामला है, के रूप में कुशल-चाल वस्तुओं कहीं अधिक आम हैं।
उस पर विस्तार - 'emplace' कोई ऑब्जेक्ट नहीं बनाता है और फिर इसे कंटेनर में ले जाता है; यह कंटेनर पर तर्कों को आगे बढ़ाने के लिए * अग्रेषण * का उपयोग करता है, और उसके बाद कंटेनर ऑब्जेक्ट कन्स्ट्रक्टर को आमंत्रित करता है जब कंटेनर ने यह पता लगाया है कि स्मृति में जहां ऑब्जेक्ट बनाया गया है। (भ्रामक कार्य नाम!) –