2015-12-16 4 views
5

Я хотел бы объединить два std::unordered_map: mapA и mapB, сохраняя при этом приоритет для элементов из mapA, если обе карты содержат один и тот же ключ.Слияние двух неупорядоченных_мапсов с перекрывающимися ключами

Есть ли элегантный способ сделать это (а не проверять каждый ключ .. мои карты содержат большое количество элементов)?

Пример:

mapA = {{"sugar",0.1},{"salt",0.2}} 
mapB = {{"sugar",0.3},{"pepper",0.4}} 

В результате я хотел бы иметь это:

result = {{"sugar",0.1},{"salt",0.2},{"pepper",0.4}} 

Игнорирование ключ-значение {"sugar",0.3} из mapB

Спасибо.

+0

Моя первая мысль будет вставить результат 'станд :: set_difference' с настраиваемой компаратора в' mapA'. – Tim

ответ

17

Абсолютно:

auto result = mapA; 
result.insert(mapB.begin(), mapB.end()); 

В insert функции-члены unordered_map ничего не делать, если ключ уже существует в контейнере.

Demo.

+0

Работает как очарование! благодаря! – MZHm

0

С std::unordered_map является несортированным, другого выхода нет. Вам нужно будет перебрать каждый элемент в mapB и попытаться вставить его в mapA. Существующие элементы в mapA не будут вставлены.