首页 > 解决方案 > 如何将结构映射分割成具有相同键的子集?

问题描述

我有一个结构映射,其中包含多个命名值,如下所示:


struct MyData {
    MyType dataA;
    std::string dataB;
    int dataC;
  };

typedef std::pair<std::string, MyData> PairType;

std::map<PairType::first_type, PairType::second_type> dataMap;

这是在从库中调用函数的编译单元的头文件中定义的。因为库函数不知道我的类型定义,所以不能直接传递dataMap。该函数实际上只需要dataAstruct 成员并且已经知道 about MyType,所以我可以通过 astd::map<std::string, MyType>代替。

什么是从结构映射中仅剪切我需要的数据并将其保存到具有相同键但只有类型和值的新映射的最优雅方法dataA

最好用于不使用 boost 或其他外部库的 C++0x,但出于教育目的,也欢迎针对较新标准的解决方案。

我基本上是在寻找相当于 Python 的

newDict = {key:value.dataA for (key,value) in oldDict.items()}

标签: c++stdmap

解决方案


您可以使用基于范围的 for 循环来真正轻松地制作副本。那看起来像

std::map<std::string, MyType> my_type_map;
for (const auto& pair : dataMap)
{
    my_type_map.emplace(pair.first, pair.second.dataA);
} 

推荐阅读