Карта STL - вставка или обновление
У меня есть карта объектов, и я хочу обновить объект, сопоставленный ключу, или создать новый объект и вставить в карту. Обновление выполняется с помощью другой функции, которая принимает указатель на объект (void update (MyClass * obj))
Каков наилучший способ "вставить или обновить" элемент на карте?
Ответы
Ответ 2
С чем-то вроде следующего фрагмента:
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));
Ответ 3
что-то вроде:
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);
здесь хорошая ссылка ссылка
Ответ 4
operator[]
уже делает, что вы хотите. Подробнее см. ссылка.