के बाद मैं एक VALUE_TYPE के साथ एक std::unordered_map
कि एक डिफ़ॉल्ट निर्माता नहीं है तो मैं निम्नलिखितप्रदर्शन क़ायम करना
auto k = get_key();
auto& v = my_map[k];
मैं एक सहायक समारोह
लेखन समाप्त हो गया ऐसा नहीं कर सकते है की जांच से भी बदतर हैvalue_type& get_value(key_type& key)
{
return std::get<0>(my_map.emplace(
std::piecewise_construct,
std::forward_as_tuple(key),
std::forward_as_tuple(args_to_construct_value)
))->second;
}
लेकिन प्रदर्शन निम्न संस्करण की तुलना में काफी खराब था (यानी मान_ प्रकार का कन्स्ट्रक्टर पेर्फ में दिखाया गया था)।
value_type& get_value(key_type& key)
{
auto it = my_map.find(key);
if (it == my_map.end())
return std::get<0>(my_map.emplace(
std::piecewise_construct,
std::forward_as_tuple(key),
std::forward_as_tuple(args_to_construct_value)
))->second;
else
return it->second;
}
मैं std::unordered_map::emplace object creation कि जरूरतों को क़ायम करना आदेश अगर मौजूद है को देखने के लिए वस्तु के निर्माण के लिए से पढ़ें। लेकिन प्रतिस्थापन यह देखने के लिए जांच कर रहा है कि यह कुंजी मान जोड़ी वापस आने से पहले मानचित्र में मौजूद है या नहीं।
क्या मैं गलत तरीके से जगह का उपयोग कर रहा हूं?
- मेरी VALUE_TYPE (मेरी पहली विधि के रूप में) हर देखने का निर्माण नहीं होगा
- जांच नहीं करेंगे, तो VALUE_TYPE दो बार मेरे नक्शे में मौजूद है को देखने के लिए: वहाँ एक बेहतर पैटर्न मैं पालन करना चाहिए कि है (मेरी दूसरी विधि में के रूप में)
धन्यवाद
तुम क्यों [emplace_hint] के साथ दूसरे दृष्टिकोण (का उपयोग नहीं करते http://en.cppreference.com/w/cpp/container/unordered_map/emplace_hint: समस्या यह है कि इस तरह के निर्माण का पता लगाने के बहुत बारीकियों है)? – nosid
@ नोसिड: क्योंकि इसके लिए आपको संकेत मिलता है, जिसके पास वह नहीं है। उसके पास एक 'एंड' इटेटरेटर –
है, असल में, इसके बारे में सोचने के लिए आओ, मेरे पास सबसे अजीब विचार नहीं है जहां कोई विश्वसनीय रूप से _unordered_ मानचित्र के लिए संकेत प्राप्त कर सकता है। मुझे पता है कि आप मानचित्र के लिए 'lower_bound' का उपयोग कर सकते हैं, लेकिन मुझे यकीन नहीं है कि यह अनियंत्रित के लिए काम करता है या नहीं। –