基于多个条件处理地图中的所有元素
Process all elements in map based on multiple conditions
我有以下数据结构:
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特性来简化代码?
如果我理解正确,你可以高度简化你的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++访问矢量中的地图元素
- 如何知道地图中的最后一个元素是否被删除?
- C++将所有元素从矢量复制到地图/unordered_map的最佳方法
- 如何计算地图中重复元素/值的数量?
- 如何将元素插入到标准::地图的共享指针中?
- 如何从地图访问数组的元素?
- 地图是否将元素存储为 std::p air?
- 从地图上擦除元素,然后将其放回原处
- 如何打印属于地图的一系列元素(std::p air<size_t,std::string>)(不是所有元素)
- 在无序地图中替换元素
- 尝试访问地图中元素时的错误
- 在地图中搜索结构元素
- 如何在地图迭代器中检测最后一个元素
- 在地图中使用擦除的元素
- 为什么在地图中打印第二个元素
- 迭代地图和擦除元素
- 将映射从第二个元素复制到另一个地图
- GDB打印std ::地图元素
- 使用CIN将元素插入C 中的地图