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

问题描述 投票:1回答:2

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

我怎样才能找到这两个地图mapAmapB的集合交集,同时只保留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;
}
c++ unordered-map
2个回答
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
投票

您没有删除条目,您有条件地复制。这听起来像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;
}
© www.soinside.com 2019 - 2024. All rights reserved.