У меня есть карта объектов, и я хочу обновить объект, отображенный на ключе, или создать новый объект и вставить в карту. Обновление сделано другой функцией, которая берет указатель на объект (пустое обновление (MyClass *obj))
Что лучший способ состоит в том, чтобы "вставить или обновить" элемент в карте?
что-то вроде:
map<int,MyClass*> mymap;
map<int,MyClass*>::iterator it;
MyClass* dummy = new MyClass();
mymap.insert(pair<int,MyClass*>(2,dummy));
it = mymap.find(2);
update(it.second);
здесь хорошая ссылка ссылка
Оператор []
уже делает то, что вы хотите. Подробнее см. в ссылке .
Примером следующего фрагмента:
std::map<Key, Value>::iterator i = amap.find(key);
if (i == amap.end())
amap.insert(std::make_pair(key, CreateFunction()));
else
UpdateFunction(&(i->second));
Если вы хотите измерить что-то, что может улучшить производительность, вы можете использовать .lower_bound ()
, чтобы найти, где находится запись, и использовать это как подсказку для вставьте в том случае, когда вам нужно вставить новый объект.
std::map<Key, Value>::iterator i = amap.lower_bound(key);
if (i == amap.end() || i->first != key)
amap.insert(i, std::make_pair(key, CreateFunction()));
// Might need to check and decrement i.
// Only guaranteed to be amortized constant
// time if insertion is immediately after
// the hint position.
else
UpdateFunction(&(i->second));