2012-02-19 2 views
2

次のコードは、キーと値を格納する必要があります。最後に、私はすべての値の合計を求めます。しかし、my関数オブジェクトの変数* sum_all *には、毎回 "0"が含まれています。何が起こっている?function_object for_eachの後のデータメンバーの値の損失

// map 
#include <iostream> 
#include <string> 
#include <map> 
#include <algorithm> 
using namespace std; 

struct Item { 
    int count; 
    double value; 
}; 


class Sum { 
public: 
    Sum() { 
     sum_all = 0.0; 
    } 
    // keys are stored as const in a map 
    void operator()(pair<const string, Item>& pair) { 
     cout << pair.first << "\n"; 
     cout << "Sum: " << pair.second.value << "\n"; 
     cout << "Middle: " << pair.second.value/pair.second.count << "\n"; 

     sum_all += pair.second.value; 
    } 
    double get_sum_all() { 
     return sum_all; 
    } 
private: 
    double sum_all; 
}; 

int main() { 
    map<string, Item> table; 

    for (int i = 0; i < 3; i++) { 
     string key; 
     double value; 
     cin >> key; 
     cin >> value; 

     // new item 
     if (table.find(key) == table.end()) { 
      Item item; 
      item.count = 1; 
      item.value = value; 
      table[key] = item; 
     } else { 
      Item& item = table[key]; 
      item.count++; 
      item.value += value; 
     } 
    } 

    Sum sum; 
    for_each(table.begin(), table.end(), sum); 

    cout << "table.size() " << table.size() << "\n"; 
    cout << "sum.get_sum_all() " << sum.get_sum_all() << "\n"; 
    cout << "sum.get_sum_all()/table.size()" << sum.get_sum_all()/table.size() << "\n"; 


    return 0; 
} 

例の入力/出力:それはfor_each中べきよう

[[email protected] chap_6]$ ./u3_map 
foo 1 
bar 2 
foo 1 
bar 
Sum: 2 
Middle: 2 
foo 
Sum: 2 
Middle: 1 
table.size() 2 
sum.get_sum_all() 0 
sum.get_sum_all()/table.size()0 

デバッグ示し、そのsum_allが変更されます。しかし、私はウォッチポイントを設定することができません、またはgdbはウォッチポイントを無視します。私はコンストラクタが2回呼び出されたと思ったが、これは起こらないようだ。私は間違っているの?おかげさまで

答えて

3

std::for_each値によって、ない参照によってそのファンクタ引数を取ります。オリジナルは変更されていません。あなたはこのような何かをする必要があります:

sum = for_each(table.begin(), table.end(), sum); 
+0

くそー!ありがとう!とてもばかげている! – Peter

関連する問題