Jawaban atas pertanyaan ini juga bergantung pada seberapa mahal untuk membuat tipe nilai yang Anda simpan di peta:
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;
}
}
Untuk tipe nilai seperti int, cara di atas akan lebih efisien daripada pencarian yang diikuti dengan penyisipan (jika tidak ada pengoptimalan compiler). Seperti yang dinyatakan di atas, ini karena pencarian melalui peta hanya dilakukan satu kali.
Namun, panggilan untuk menyisipkan mengharuskan Anda sudah memiliki "nilai" baru yang dibuat:
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;
}
}
Untuk memanggil 'sisipkan' kami membayar untuk panggilan mahal untuk membangun tipe nilai kami - dan dari apa yang Anda katakan dalam pertanyaan Anda tidak akan menggunakan nilai baru ini 20% dari waktu. Dalam kasus di atas, jika mengubah tipe nilai peta bukanlah pilihan, maka lebih efisien untuk melakukan 'find' terlebih dahulu untuk memeriksa apakah kita perlu membangun elemen.
Alternatifnya, tipe nilai peta bisa diubah untuk menyimpan pegangan ke data menggunakan tipe penunjuk pintar favorit Anda. Panggilan untuk memasukkan menggunakan pointer nol (sangat murah untuk dibangun) dan hanya jika perlu tipe data baru dibangun.