Как перенести ключи и значения с карты на другую карту? - PullRequest
0 голосов
/ 23 сентября 2019

Я хочу перенести ключи и значения на другую карту, но в то же время оставить старые ключи и значения.

Как я могу это сделать?мой пример не работает.

    map1.emplace(1, 1001);
    map1.emplace(2, 1002);
    map1.emplace(3, 1003);

    map2.emplace(10, 1010);
    map2.emplace(11, 1011);
    map2.emplace(12, 1012);

    map1 = map2;

    cout << map1[1] << endl;
    cout << map1[10] << endl;
    cout << map2[3] << endl;

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

На самом деле, когда вы назначаете map2 на map1.Он копирует map2 в map1, заменяя старое содержимое.

Поэтому после присвоения старые значения теряются, и map1 теперь является точной копией map2.

Если вы хотите добавить только новые элементы, вы можете использовать функцию insert().Это может выглядеть следующим образом:

#include <map>

int main()
{
    std::map<int, int> map1 {{1 ,1001}, {2, 1002}, {3, 1003}};
    std::map<int, int> map2 {{10, 1010}, {11, 1011}, {12, 1012}};

    map1.insert(map2.cbegin(), map2.cend());

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

    return 0;
}

Таким образом, map2 вставляется в map1 без удаления старого содержимого.Вам просто нужно знать, что если вы попытаетесь вставить уже существующий ключ, он не будет вставлен (поскольку все элементы уникальны в std::map).


РЕДАКТИРОВАТЬ:

Если вы также хотите заменить уже существующие значения, вы можете просто использовать operator[].Это может выглядеть как:

for(const auto & e : map2)
{
    // If the key exists, change only the value, add the {key, value} otherwise
    map1[e.first] = e.second;
}
0 голосов
/ 23 сентября 2019

Вы можете std::insert map2 в map1.Если ключ присутствует в map1, он сохранит свое значение (независимо от того, что этот ключ может быть в map2).Если ключ присутствует в map2, но отсутствует в map1, он будет скопирован со своим значением в map1.

#include <iostream>
#include <map>

enum { ONLY_IN_MAP1, BOTH_IN_MAP1_AND_MAP2, ONLY_IN_MAP2 };

int main()
{
    std::map<int, int> map1, map2;

    map1.emplace(ONLY_IN_MAP1, 1);
    map1.emplace(BOTH_IN_MAP1_AND_MAP2, 2);

    map2.emplace(ONLY_IN_MAP2, 3);
    map2.emplace(BOTH_IN_MAP1_AND_MAP2, 4);

    map1.insert(cbegin(map2), cend(map2));

    std::cout << map1[ONLY_IN_MAP1]          << '\n'; // 1
    std::cout << map1[BOTH_IN_MAP1_AND_MAP2] << '\n'; // 2
    std::cout << map1[ONLY_IN_MAP2]          << '\n'; // 3
}

Демо: https://coliru.stacked -crooked.com /а / 571c588e8cee5fb8

...