c++ - 根据多个条件处理 map 中的所有元素

标签 c++ algorithm stl c++17

我有以下数据结构:

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;
    }
}
如您所见, map 项是根据p1p2p3值进行匹配的。上述参数的size和等于25。是否可以使用c++ 17 / STL功能简化该代码?

最佳答案

如果我理解正确,则可以按照以下方式高度简化for range循环

   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;
如果愿意,可以使用std::for_each(),包括<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; });
但我看不出比上述解决方案有优势。

关于c++ - 根据多个条件处理 map 中的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62900421/

相关文章:

需要以 OutputIterator 作为参数的成员函数的 C++ 概念

c# - C++ 或 C# : Reading commands from a Human Interface Device(HID)

c++ - Gradle C( native )任务输出文件/文件(用于其他任务/项目)

c++ - g++ 中的错误 "cannot appear in a constant-expression"但 gcc 中没有

algorithm - A* 找到第二条最短路径

python - 列表列表的 Python 调度优化 [间隔调度]

c++ - 使用 Hash Maps 表示一个非常大的数据源

objective-c - 按当前时间计算两个int值

c++ - 具有最低值的查找元素的关联容器

C++ 结构对齐和 STL vector