2014-12-01 7 views
0

Пусть я две картыОбъединить две карты <string,int>

std::map<string,int> mapA; 

mapA["cat"] = 1; 
mapA["dog"] = 3; 

, то другой карта mapB

std::map<string,int> mapB; 

mapB["cat"] = 1; 
mapB["horse"] = 3; 

Теперь нужно объединить mapB в МАПО поэтому окончательный MAPA выглядит следующим образом после слияния

mapA["cat"] = 2; 
mapA["dog"] = 3; 
mapA["horse"] = 3; 

Я хотел знать, как наилучшим образом достичь этого? Я знаю, что я мог бы перебирать через MapB и проверять, есть ли каждый элемент в MapA, если он затем увеличивает значение в противном случае. Добавьте его в MapA. Мой вопрос в том, есть ли алгоритм или более эффективный подход?

+0

Алгоритм, который может быть более эффективным, чем прямой подход, может попытаться использовать тот факт, что обе карты используют один и тот же порядок. К сожалению, 'map :: insert', который принимает подсказку, не возвращает, мог ли элемент быть найден (если бы это было возможно, вы могли бы попытаться использовать прежний целевой элемент в качестве подсказки для следующего). – dyp

+0

Эскиз алгоритма 'O (N + M) в наилучшем случае: http://coliru.stacked-crooked.com/a/0932b4743edf9824 Я мог бы смущаться о позиции подсказки/вставки. – dyp

ответ

4
template <class M> 
void add_maps(M const& source, M& dest) 
{ 
    for (auto const& entry : source) 
     dest[entry.first] += entry.second; 
} 
+0

Поскольку аргументы не обрабатываются эквивалентно, я бы предпочел выбрать имена, которые отражают это. – dyp

+0

@ dyp Согласен. Какие имена вы предлагаете? –

+0

Что будет 'auto' быть здесь в случае карты? – MistyD