2017-01-11 45 views
0
typedef struct A{ 
     string id; 
     long date; 
     // operator = and < overloading 
    }Test; 

Map<Test, double> testMap[2]; 

在代码中,testMap阵列填充有键和值与一些业务逻辑。地图除了与键作为结构

我需要计算两个映射为每A.id总双重价值。请注意,总和应仅基于A.id而不是整个结构密钥。
要做到这一点,我可以申请使用循环正常蛮力方法,并得到结果。

但我想以发现这个问题,可以优化代码的替代解决方案。请建议。要做到这一点

+0

有没有你不使用这样的理由:地图 testMap [2]; ? – user

+0

对于每个ID,我们可能在不同的日期有不同的交易。所以将地图关键字作为ID和日期的组合。 – user1706047

+0

好像'地图<串,对<矢量,长>> test_map [2]'可能在该特定情况下更好地工作。 – evan

回答

1

的一种方法是应用嵌套std::accumulate两次,一次用于总结阵列和对于每个阵列来总结地图内容:

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 
+0

在这种情况下,testMapArray [0] [{“A”,0}] = 0.1; testMapArray [0] [{“A”,1}] = 0.1;第二个键将覆盖第一个键。我认为他希望根据身份和数据进行比较。 – user1438832

+0

@ user1438832是的你是对的。我关注的是总结而不是他对关键比较器的实现。固定。 – Galik

+0

我觉得这是一个很好的方法! – user1706047