Карта STL - вставьте или обновите - PullRequest
17 голосов
/ 07 мая 2010

У меня есть карта объектов, и я хочу обновить объект, сопоставленный с ключом, или создать новый объект и вставить в карту. Обновление выполняется другой функцией, которая получает указатель на объект (void update (MyClass * obj))

Каков наилучший способ «вставить или обновить» элемент на карте?

Ответы [ 4 ]

20 голосов
/ 07 мая 2010
11 голосов
/ 07 мая 2010

С чем-то вроде следующего фрагмента:

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));
1 голос
/ 07 мая 2010

operator[] уже делает то, что вы хотите. Подробнее см. ссылка .

1 голос
/ 07 мая 2010

что-то вроде:

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);

здесь хорошая ссылка ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...