2017-01-11 43 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