2015-01-15 14 views
33

सी ++ 11 std::map<K,V> प्रकार एक emplace कार्य है कॉपी किए बिना ही कई अन्य कंटेनरों है।std :: नक्शा, ठहरना मूल्य

std::map<int,std::string> m; 

std::string val {"hello"}; 

m.emplace(1, val); 

इस कोड के रूप में विज्ञापित काम करता है, सीधे std::pair<K,V> emplacing, लेकिन यह key और val जगह लेने की एक प्रति का परिणाम है।

यह मान प्रकार नक्शे में सीधे क़ायम करना करने के साथ ही संभव है? क्या हम कॉल में तर्कों को emplace पर ले जाने से बेहतर कर सकते हैं?

struct Foo 
{ 
    Foo(double d, string s) {} 
    Foo(const Foo&) = delete; 
    Foo(Foo&&) = delete; 
} 

map<int,Foo> m; 
m.emplace(1, 2.3, string("hello")); // invalid 
+0

@ Cheersandhth.-Alf, मैं दस्तावेजों की एक गुच्छा पढ़ सकते हैं और निष्कर्ष यह है कि यह संभव नहीं है पर आए हैं। हालांकि मैं सबसे अनुभवी सी ++ डेवलपर नहीं हूं, इसलिए उम्मीद है कि मैं गलत हूं, यहां कुछ गुरुओं के पीछे इसे चलाने के लिए चाहता हूं। क्या आप मदद कर सकते हैं? –

+0

ठीक है, http://en.cppreference.com/w/cpp/container/map/emplace –

+3

पढ़ आप एक * अतिरिक्त * प्रतिलिपि मतलब है? 'वैल 'एक लाभा है, इसलिए किसी प्रतिलिपि को कुछ बिंदु पर बनाना होगा। – juanchopanza

उत्तर

49

तर्क आप map::emplace को पारित map::value_type के निर्माता है, जो pair<const Key, Value> है के पास भेज पाने:


यहाँ एक अधिक गहन उदाहरण है। इसलिए आप मध्यवर्ती प्रतियों और चालों से बचने के लिए std::pair के piecewise construction constructor का उपयोग कर सकते हैं।

std::map<int, Foo> m; 

m.emplace(std::piecewise_construct, 
      std::forward_as_tuple(1), 
      std::forward_as_tuple(2.3, "hello")); 

Live demo

+1

बहुत बहुत धन्यवाद। ऐसा लगता है कि मुझे वास्तव में जिस तरह के बारे में जानने की आवश्यकता है। –

6

सी ++ 17 इस में और अधिक आसानी से try_emplace विधि के साथ प्राप्त किया जा सकता।

map<int,Foo> m; 
m.try_emplace(1, 2.3, "hello"); 

मानक पुस्तकालय के लिए यह इसके अलावा paper N4279 में कवर किया गया था और पहले से ही Visual Studio 2015, GCC 6.1 और LLVM 3.7 (libC++ पुस्तकालय) में समर्थन किया जाना चाहिए।

संबंधित मुद्दे