我有两个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;
}
答案 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;
}