2017-03-02 58 views
0

我有一些代碼看起來大致像這樣;給定兩張地圖,如果兩張地圖中都存在first鍵,則將兩個值相乘,然後求和所有產品。例如:執行映射中匹配對的功能

s1 = {{1, 2.5}, {2, 10.0}, {3, 0.5}}; 
s2 = {{1, 10.0},   {3, 20.0}, {4, 3.33}}; 

答案應該是2.5*10.0 + 0.5*20.0,即匹配鍵的乘積之和。

double calcProduct(std::map<int, double> const &s1, std::map<int, double> const &s2) 
{ 
    auto s1_it = s1.begin(); 
    auto s2_it = s2.begin(); 

    double result = 0; 
    while (s1_it != s1.end() && s2_it != s2.end()) 
    { 
     if (s1_it->first == s2_it->first) 
     { 
      result += s1_it->second * s2_it->second; 
      s1_it++: 
      s2_it++; 
     } 
     else if (s1_it->first < s2_it->first) 
     { 
      s1_it = s1.lower_bound(s2_it->first); 
     } 
     else 
     { 
      s2_it = s2.lower_bound(s1_it->first); 
     } 
    } 
    return result; 
} 

我想重構這個和std::set_intersection似乎是接近我想要的文檔有an example using std::back_inserter,但有沒有辦法得到這個在地圖上的工作,避免了中間陣列?

+0

檢查您設置的對象聲明。看來你的意思是std :: pair作爲模板參數。 –

+0

另外一個關於你每次找到一對匹配的時候你期望做什麼的詞,每次你沒有。 – tinstaafl

+0

@tinstaafl我已經添加了一些描述我正在嘗試做的事情的文本。 –

回答

2

您使用的代碼已經非常接近set_intersect的實施方式。我看不出有什麼好處來創建一個新的地圖並迭代它。

然而,我想提及你的代碼有幾件事。

如果你要遞增迭代器,你不應該使它們保持不變。

我期望在尋找等效元素時會有更多的失誤。我建議首先進行比較:

double calcProduct(std::map<int , double> const &s1 , std::map<int , double> const &s2) 
{ 
    auto s1_it = s1.begin(); 
    auto s2_it = s2.begin(); 

    double result = 0; 
    while (s1_it != s1.end() && s2_it != s2.end()) 
    { 
     if (s1_it->first < s2_it->first) 
     { 
      s1_it = s1.lower_bound(s2_it->first); 
     } 
     else if(s2_it->first < s1_it->first) 
     { 
      s2_it = s2.lower_bound(s1_it->first); 
     } 
     else 
     { 
      result += s1_it->second * s2_it->second; 
      s1_it++; 
      s2_it++; 
     } 
    } 
    return result; 
} 
+0

'const'迭代器是一個錯字,很抱歉。看看這些數字,循環的平均次數大約是每次1000次,只有1%是匹配,所以我會嘗試一下你的建議。 –