c++ - 根据多个条件处理地图中的所有元素
问题描述
我有以下数据结构:
struct Data
{
int p1;
int p2;
int p3;
int size;
};
我需要根据 p1、p2 和 p3 参数对地图中所有元素的大小求和。这是一个示例代码:
std::unordered_map<int, Data> m;
m[1] = Data{ 11, 22, 33, 10 };
m[2] = Data{ 33, 22, 11, 15 };
m[3] = Data{ 55, 55, 55, 25 };
int p1 = -1, p2 = 22, p3 = -1;
int size = 0;
for(const auto [key, data]: m)
{
if ((p1 >= 0) && (p2 >= 0) && (p3 >= 0))
{
if ((p1 == data.p1) && (p2 == data.p2) && (p3 == data.p3))
{
size += data.size;
}
}
else if ((p1 >= 0) && (p2 >= 0) && (p3 < 0))
{
if ((p1 == data.p1) && (p2 == data.p2))
{
size += data.size;
}
}
else if ((p1 >= 0) && (p2 < 0) && (p3 >= 0))
{
if ((p1 == data.p1) && (p3 == data.p3))
{
size += data.size;
}
}
else if ((p1 < 0) && (p2 >= 0) && (p3 >= 0))
{
if ((p2 == data.p2) && (p3 == data.p3))
{
size += data.size;
}
}
else if ((p1 < 0) && (p2 < 0) && (p3 >= 0))
{
if (p3 == data.p3)
{
size += data.size;
}
}
else if ((p1 < 0) && (p2 >= 0) && (p3 < 0))
{
if (p2 == data.p2)
{
size += data.size;
}
}
else if ((p1 >= 0) && (p2 < 0) && (p3 < 0))
{
if (p1 == data.p1)
{
size += data.size;
}
}
else
{
size += data.size;
}
}
如您所见,地图项基于p1
,p2
和p3
值进行匹配。上述参数的size
总和等于 25。是否可以使用 c++17/stl 功能简化该代码?
解决方案
If I understand correctly, you can highly simplify your for range loop as follows
for ( auto const & [key, data] : m )
if ( ((p1 < 0) || (p1 == data.p1))
&& ((p2 < 0) || (p2 == data.p2))
&& ((p3 < 0) || (p3 == data.p3)) )
size += data.size;
If you prefer, you can use std::for_each()
, including <algorithm>
std::for_each(m.cbegin(), m.cend(), [&](auto const & p)
{ if ( ((p1 < 0) || (p1 == p.second.p1))
&& ((p2 < 0) || (p2 == p.second.p2))
&& ((p3 < 0) || (p3 == p.second.p3)) )
size += p.second.size; });
but I don't see advantages over the preceding solution.
推荐阅读
- r - 根据数据框中的字符列出文件(部分名称匹配)
- github - 如何在 github 上使用 bookdown.org?
- javascript - 如何从字符串中提取子字符串并将它们存储为键值对
- angular - 如何在 Angular 工作区配置中用属性 fileReplacements 替换文件?
- hadoop - 从源代码构建 Amabari HDP 堆栈
- html - 如何使表格 HTML 中的图像大小相等
- javascript - 材质-ui
getOptionLabel - 将空字符串作为值传递 - javascript - 视频未显示在传单地图顶部
- python - Python/SQL Server - SELECT 问题中的子查询
- excel - 修复它需要索引匹配代码修改帮助