इस प्रश्न का उत्तर इस बात पर भी निर्भर करता है कि मानचित्र में आपके द्वारा संग्रहित मूल्य प्रकार बनाना कितना महंगा है:
typedef std::map <int, int> MapOfInts;
typedef std::pair <MapOfInts::iterator, bool> IResult;
void foo (MapOfInts & m, int k, int v) {
IResult ir = m.insert (std::make_pair (k, v));
if (ir.second) {
// insertion took place (ie. new entry)
}
else if ( replaceEntry ( ir.first->first ) ) {
ir.second->second = v;
}
}
एक मान जैसे कि एक इंट के लिए, उपरोक्त एक सम्मिलित द्वारा पीछा करने की तुलना में अधिक कुशल होगा (संकलक अनुकूलन की अनुपस्थिति में)। जैसा कि ऊपर कहा गया है, यह इसलिए है क्योंकि मानचित्र के माध्यम से खोज केवल एक बार होती है।
हालाँकि, कॉल करने के लिए आवश्यक है कि आपके पास पहले से निर्मित नया "मूल्य" हो:
class LargeDataType { /* ... */ };
typedef std::map <int, LargeDataType> MapOfLargeDataType;
typedef std::pair <MapOfLargeDataType::iterator, bool> IResult;
void foo (MapOfLargeDataType & m, int k) {
// This call is more expensive than a find through the map:
LargeDataType const & v = VeryExpensiveCall ( /* ... */ );
IResult ir = m.insert (std::make_pair (k, v));
if (ir.second) {
// insertion took place (ie. new entry)
}
else if ( replaceEntry ( ir.first->first ) ) {
ir.second->second = v;
}
}
'इंसर्ट' को कॉल करने के लिए हम अपने मूल्य प्रकार के निर्माण के लिए महंगी कॉल का भुगतान कर रहे हैं - और इस प्रश्न में आपने जो कहा है उससे आप इस नए मूल्य का 20% समय का उपयोग नहीं करेंगे। उपरोक्त मामले में, यदि मानचित्र मान प्रकार बदलना कोई विकल्प नहीं है, तो पहले यह सुनिश्चित करने के लिए कि हमें तत्व का निर्माण करने की आवश्यकता है, उसे खोजने के लिए अधिक कुशल है।
वैकल्पिक रूप से, मानचित्र के मूल्य प्रकार को आपके पसंदीदा स्मार्ट पॉइंटर प्रकार का उपयोग करके डेटा को हैंडल करने के लिए बदला जा सकता है। सम्मिलित करने के लिए कॉल एक शून्य सूचक (निर्माण के लिए बहुत सस्ता) का उपयोग करता है और केवल यदि आवश्यक हो तो नए डेटा प्रकार का निर्माण किया जाता है।