2016-01-12 3 views
4

Предположим, что у меня есть две карты одного типа, а набор ключей второй карты - это подмножество ключей первой карты. Я хочу обновить первые значения карты со значениями со второй карты (только для ключей, которые содержит вторая карта).Обновить карту со значениями с другой карты

Я написал простой цикл, чтобы сделать это, но мне было интересно, есть ли лучший способ написать его с использованием алгоритмов STL. Образец

Код:

using PersonAgeMap = std::map<std::string, int>; 

PersonAgeMap map1; 
map1.insert(std::make_pair("John", 23)); 
map1.insert(std::make_pair("Liza", 19)); 
map1.insert(std::make_pair("Dad", 45)); 
map1.insert(std::make_pair("Granny", 77)); 

PersonAgeMap map2; 
map2.insert(std::make_pair("John", 24)); 
map2.insert(std::make_pair("Liza", 20)); 

//simple cycle way 
for (const auto& person: map2) 
{ 
    map1[person.first] = person.second; 
} 

//is there some another way of doing this using STL algorithms??? 

for (const auto& person: map1) 
{ 
    std::cout << person.first << " " << person.second << std::endl; 
} 

Выход:

Dad 45 
    Granny 77 
    John 24 
    Liza 20 
+0

_ «Я написал для него простой цикл, но есть ли лучший способ написать его с помощью алгоритмов STL?» _ Немного неясно, о чем вы просите. Вы должны знать, что 'map1 [person.first] = person.second;' вставляет значения безоговорочно, независимо от того, был ли указан параметр map1 [person.first] '. –

+0

Поскольку я написал, что ключи от map2 являются подмножеством ключей от map1, другими словами, у меня есть предварительное условие, что map1 содержит все ключи от map2, и я хочу обновлять значения на карте со значениями из map2 для этих ключей. –

+0

Вы проверили интерфейс 'map' для вставки диапазона? Вы проверили существующие алгоритмы на то, что можно было использовать? –

ответ

0

Кажется, что нет более ясного и лучшего способа сделать это, чем простой цикл.

Спасибо всем.

1

Если вы просто хотите, чтобы объединить их и сохранить элементы из map2:

std::swap(map1, map2); 
map1.insert(map2.begin(), map2.end()); 
+0

Кажется, что это работает в определенном смысле, что map1 будет содержать правильные значения, но решение кажется менее ясным и интуитивным, чем цикл, а также изменяет map2. Тем не менее возможный вариант. –

1

Это не намного короче, но может быть более эффективными, если значение является чем-то более сложным, чем int:

for(const auto &p : map2) { 
    auto r = map1.emplace(p); 
    if(!r.second) r.first->second = p.second; 
} 

PS в комментариях вы сказали, что map2 является подмножеством map1, то ваш метод, вероятно, самый простой и не менее эффективным, чем у меня.

+0

Если map2 не является подмножеством map1, ваш код лучше yep. –

Смежные вопросы