function_object потерял значение члена данных после for_each - PullRequest
2 голосов
/ 19 февраля 2012

Следующий код должен хранить ключ и значение. В конце я хочу общую сумму всех значений. Но переменная * sum_all * в объекте функции my sum содержит каждый раз "0". Что происходит?

// 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;
}

Пример ввода / вывода:

[peter@donut 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 изменяется так же, как и во время for_each. Но я не могу установить точку наблюдения, или GDB игнорирует точку наблюдения. Я думал, что конструктор вызывается дважды, но, похоже, этого не происходит. Что я делаю не так? Спасибо.

1 Ответ

3 голосов
/ 19 февраля 2012

std::for_each принимает аргумент функтора по значению , а не по ссылке .Оригинал не изменен.Вам нужно сделать что-то вроде этого:

sum = for_each(table.begin(), table.end(), sum);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...