如何获得两个std :: unordered_map的交集?

时间:2019-04-12 16:43:10

标签: c++ unordered-map

我有两个std::unordered_map实例,它们具有0个或更多的相交键。我正在尝试返回std::unordered_map的新实例,该实例的键是mapAmapB的键的交集,并且这些键的值来自mapA

如何在仅保留mapA中的值的同时找到这两个地图mapBmapA的集合相交?

以下提供了我要达到的结果的示例:

#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 个答案:

答案 0 :(得分:1)

最直接的实现是:

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;
}

我已将参数类型更改为const引用,因为您可能不想复制参数。

答案 1 :(得分:1)

您不是要删除条目,而是有条件地进行复制。这听起来像是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;
}