আপনি মানচিত্রে যে মান ধরণের সঞ্চয় করছেন তা তৈরি করা কতটা ব্যয়বহুল তার উপর এই প্রশ্নের উত্তরও নির্ভর করে:
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) {
}
else if ( replaceEntry ( ir.first->first ) ) {
ir.first->second = v;
}
}
কোনও int এর মতো মানের ধরণের জন্য, উপরেরগুলি সন্নিবেশের পরে অনুসন্ধানের চেয়ে আরও কার্যকর হবে (সংকলক অপ্টিমাইজেশনের অভাবে)। উপরে বর্ণিত হিসাবে, মানচিত্রের মাধ্যমে অনুসন্ধান কেবল একবারে ঘটেছিল কারণ এটি।
যাইহোক, সন্নিবেশ করানোর কলটির জন্য আপনার ইতিমধ্যে নতুন "মান" নির্মিত হয়েছে তা প্রয়োজন:
class LargeDataType { };
typedef std::map <int, LargeDataType> MapOfLargeDataType;
typedef std::pair <MapOfLargeDataType::iterator, bool> IResult;
void foo (MapOfLargeDataType & m, int k) {
LargeDataType const & v = VeryExpensiveCall ( );
IResult ir = m.insert (std::make_pair (k, v));
if (ir.second) {
}
else if ( replaceEntry ( ir.first->first ) ) {
ir.first->second = v;
}
}
'সন্নিবেশ' কল করার জন্য আমরা আমাদের মূল্য প্রকারটি তৈরি করতে ব্যয়বহুল কলটির জন্য অর্থ প্রদান করছি - এবং আপনি যে প্রশ্নে বলেছেন তা থেকে আপনি এই নতুন মানটি 20% ব্যবহার করবেন না। উপরের ক্ষেত্রে মানচিত্রের মান প্রকার পরিবর্তন করা যদি কোনও বিকল্প না হয় তবে আমাদের উপাদানটি তৈরি করতে হবে কিনা তা যাচাই করার জন্য প্রথমে 'ফাইন্ড' সম্পাদন করা আরও দক্ষ।
বিকল্পভাবে, মানচিত্রের মান ধরণের আপনার প্রিয় স্মার্ট পয়েন্টার টাইপ ব্যবহার করে ডেটাগুলিতে হ্যান্ডলগুলি সঞ্চয় করতে পরিবর্তন করা যেতে পারে। সন্নিবেশ করানোর কলটিতে একটি নাল পয়েন্টার (নির্মাণের জন্য খুব সস্তা) ব্যবহার করা হয় এবং প্রয়োজনে কেবল নতুন ডেটা টাইপই নির্মিত হয়।