Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将键的添加映射为结构 typedef结构A{ 字符串id; 长日期; //运算符=和_C++_Dictionary_Stl - Fatal编程技术网

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