C++ 将键的添加映射为结构 typedef结构A{ 字符串id; 长日期; //运算符=和
在代码中,C++ 将键的添加映射为结构 typedef结构A{ 字符串id; 长日期; //运算符=和,c++,dictionary,stl,C++,Dictionary,Stl,在代码中,testMap数组中填充了具有某些业务逻辑的键和值 我需要为每个A.id计算两个映射的总双倍值。请注意,求和应仅基于A.id,而不是基于整个结构键 为了实现这一点,我可以使用for循环应用普通蛮力方法并获得结果。 但我试图找到任何替代方案来解决这个问题,可以优化代码。请建议。一种方法是应用嵌套两次,一次用于汇总数组,另一次用于汇总每个数组的地图内容: typedef struct A{ string id; long date; // ope
testMap
数组中填充了具有某些业务逻辑的键和值
我需要为每个A.id
计算两个映射的总双倍值。请注意,求和应仅基于A.id
,而不是基于整个结构键为了实现这一点,我可以使用for循环应用普通蛮力方法并获得结果。
但我试图找到任何替代方案来解决这个问题,可以优化代码。请建议。一种方法是应用嵌套两次,一次用于汇总数组,另一次用于汇总每个数组的地图内容:
typedef struct A{
string id;
long date;
// operator = and < overloading
}Test;
Map<Test, double> testMap[2];
你不使用这个的原因是什么:Map testMap[2]?对于每个id,我们可能在不同的日期有不同的交易。因此,将map键设置为id和date的组合。似乎
map test\u map[2]
在这种特定情况下可能会更好。有没有任何原因不使用std::array testMaps
?在这种情况下,testMapArray[0][{“a”,0}]=0.1;testMapArray[0][{“A”,1}]=0.1;scond键将覆盖第一个键。我想他想要基于id和数据进行比较。@user1438832是的,你是对的。我关注的是总结,而不是他对关键比较器的实现。修正了。我发现这是一个很好的方法!!我正在使用vs2010。我得到与lambda表达式相关的错误。我以前从未使用过c++11。因此,我希望上述方法只能在更高版本的visual studio中实现。@user1706047可以通过创建函数对象来替换lambdas来修改早期版本的编译器代码。但它并不像使用lambdas那样清晰和简洁。如果您不能使用C++11
,那么我建议您仅手动构造循环。
struct Test
{
string id;
long date;
bool operator<(Test const& test) const
{
if(date == test.date)
return id < test.id;
return date < test.date;
}
};
double sum_per_id(std::array<std::map<Test, double>, 2> const& testMapArray,
std::string const& id)
{
return std::accumulate(std::begin(testMapArray), std::end(testMapArray), 0.0,
[&id](double d, std::map<Test, double> const& testMap)
{
return d + std::accumulate(std::begin(testMap), std::end(testMap), 0.0,
[&id](double d, std::map<Test, double>::value_type const& p)
{
if(id == p.first.id)
return d + p.second;
return d;
});
});
}
int main()
{
std::array<std::map<Test, double>, 2> testMapArray;
testMapArray[0][{"A", 0}] = 0.1;
testMapArray[0][{"B", 1}] = 0.2;
testMapArray[1][{"A", 2}] = 0.3;
testMapArray[1][{"B", 3}] = 0.4;
std::cout << "sum: " << sum_per_id(testMapArray, "A") << '\n';
}
sum: 0.4