c++ - 如何将结构映射分割成具有相同键的子集?
问题描述
我有一个结构映射,其中包含多个命名值,如下所示:
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。该函数实际上只需要dataA
struct 成员并且已经知道 about MyType
,所以我可以通过 astd::map<std::string, MyType>
代替。
什么是从结构映射中仅剪切我需要的数据并将其保存到具有相同键但只有类型和值的新映射的最优雅方法dataA
?
最好用于不使用 boost 或其他外部库的 C++0x,但出于教育目的,也欢迎针对较新标准的解决方案。
我基本上是在寻找相当于 Python 的
newDict = {key:value.dataA for (key,value) in oldDict.items()}
解决方案
您可以使用基于范围的 for 循环来真正轻松地制作副本。那看起来像
std::map<std::string, MyType> my_type_map;
for (const auto& pair : dataMap)
{
my_type_map.emplace(pair.first, pair.second.dataA);
}
推荐阅读
- angularjs - Angular在Ng重复中调用一个函数
- css - 使用 flexbox 时强制 ul li ul 在新行上
- php - 在 Woocommerce 中通过 URL 应用优惠券代码
- ruby-on-rails - Active Record - 重复的属性值,即使有验证
- c# - 关于如何为 c#winforms 控件创建阴影的任何想法
- asp.net - 使用 dotnet publish 或 Visual Studio publish 部署后,带有 .Net Framework 4.6.1 的 Asp.Net Core 2.1 错误
- git - 如何使用 Terraform 为 AWS CodeCommit 生成 HTTPS Git 凭证
- javascript - Chart.js - 找不到 Moment.js!您必须在 Chart.js 之前包含它才能使用时间刻度
- swift - 可以扩展 Kotlin 类以符合接口(如 Swift 类可以)吗?
- java - IBM Watson 不在企业网络中工作