Как получить пересечение множеств двух std :: unordered_map? - PullRequest
1 голос
/ 12 апреля 2019

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

Как можноЯ нахожу пересечение этих двух карт mapA и mapB, сохраняя только значения из mapA?

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

#include <unordered_map>

typedef std::unordered_map<std::string, double> MapType;

MapType intersectFilter(MapType const & mapA, MapType const & mapB);

int main()
{
    MapType mapA = { {"keyA",  1}, {"keyB", 2} };
    MapType mapB = { {"keyA",  5}, {"keyK", 3} };

    MapType mapC = intersectFilter(mapA, mapB);
    // The resulting `mapC` should be:
    // { {"keyA", 1} }

    return 0;
}

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Вы не удаляете записи, вы условно копируете.Это звучит как работа для std::copy_if.

MapType intersectFilter(MapType const & mapA, MapType const & mapFilter)
{
    MapType result;
    auto inserter = std::inserter(result, result.end());
    auto predicate = [&mapFilter](MapType::const_reference item) 
    { return mapFilter.find(item.first) == mapFilter.end(); }; // or mapFilter.contains in C++20
    std::copy_if(mapA.begin(), mapA.end(), inserter, predicate);
    return result;
}
1 голос
/ 12 апреля 2019

Самая простая реализация:

MapType intersectFilter(const MapType& mapA, const MapType& mapFilter)
{
    MapType result;
    for (const auto& pair: mapA)
    {
        if (mapFilter.find(pair.first) != mapFilter.end())
            result.insert(pair);
    }

    return result;
}

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

...