Сравните 2 неравных размера карт с ++ - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть 2 разных карты (строка, строка) разного размера. Мне нужно сравнить и вернуть различные элементы, присутствующие на карте.

eg: map1 contains
"1":"abc"
"2":"xyz"
"3":"abc"
eg: map2 contains
"1":"abcd"
"2":"xyz"
"4":"abc"
"5":"abc"

Если вы сравниваете 2 карты, сопоставляется только «2». Остальные не имеют себе равных. Мне нужно собрать все непревзойденные на другую карту.

1 Ответ

8 голосов
/ 19 февраля 2020

set_symmetric_difference должно работать нормально:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <map>
#include <string>

int main()
{
    std::map<std::string, std::string>
        map1 {
            { "1", "abc" },
            { "2", "xyz" },
            { "3", "abc" }
        },
        map2 {
            { "1", "abcd" },
            { "2", "xyz" },
            { "4", "abc" },
            { "5", "abc" }
        },
        map3;

    std::set_symmetric_difference(map1.cbegin(), map1.cend(), map2.cbegin(), map2.cend(),
        inserter(map3, map3.end()));

    for (auto const& p : map3) {
        std::cout << p.first << " : " << p.second << '\n';
    }
}

Вывод:

1 : abc
3 : abc
4 : abc
5 : abc

Как указано в комментарии, если у вас разные значения для одной клавиши, эта версия потеряет одно из значений. Если это проблема, вы можете сделать map3 a std::multimap<std::string, std::string> или std::vector<std::pair<std::string, std::string>> и сохранить все значения. ЖИВОЙ

...