Bu sorunun cevabı, haritada sakladığınız değer türünü yaratmanın ne kadar pahalı olduğuna da bağlıdır:
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;
}
}
İnt gibi bir değer türü için, yukarıdakiler bir bul ve ardından gelen bir eklemeden daha verimli olacaktır (derleyici optimizasyonları olmadığında). Yukarıda belirtildiği gibi, bunun nedeni harita üzerinden aramanın yalnızca bir kez yapılmasıdır.
Ancak, eklenecek çağrı, yeni "değeri" oluşturmuş olmanızı gerektirir:
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;
}
}
'Ekleme' olarak adlandırmak için, değer türümüzü oluşturmaya yönelik pahalı çağrının bedelini ödüyoruz - ve soruda söylediklerinizden, bu yeni değeri% 20 oranında kullanmayacaksınız. Yukarıdaki durumda, harita değer türünü değiştirmek bir seçenek değilse, öğeyi inşa etmemiz gerekip gerekmediğini kontrol etmek için önce 'bul'u gerçekleştirmek daha etkilidir.
Alternatif olarak, haritanın değer türü, favori akıllı işaretçi türünüzü kullanarak tutamaçları verilere depolamak için değiştirilebilir. Ekleme çağrısı bir boş gösterici kullanır (inşa etmesi çok ucuzdur) ve yalnızca gerekirse yeni veri türü oluşturulur.