Как применить алгоритм std :: накопить для ассоциативных контейнеров? - PullRequest
4 голосов
/ 04 августа 2011

Для карты типа std :: map, как мне накапливать сумму ее значений?
На самом деле я сделал это с помощью функтора и алгоритма std :: for_each.Но я также хотел бы сделать это с помощью алгоритма std :: накопления.
Я понятия не имею, как применить его к std :: map.
Возможно ли это?

Ответы [ 2 ]

6 голосов
/ 04 августа 2011

Почти.Функтор должен быть бинарным оператором, принимающим тип возвращаемого значения в качестве первого и тип диапазона в качестве второго аргумента:

x = Functor(init, *it++);
x = Functor(x, *it++);
x = Functor(x, *it++);
// ... until it == end

Так что вам вообще не нужен функтор с состоянием, простая функция будет делать:

int map_acc(int lhs, const std::pair<int, int> & rhs)
{
  return lhs + rhs.second;
}

const int sum = std::accumulate(m.begin(), m.end(), 0, map_acc);
2 голосов
/ 04 августа 2011

std :: аккумулировать требуется аргумент init и двоичная операция для выполнения. Ваша двоичная операция должна принять пару в качестве второго аргумента и int в качестве первого аргумента и вернуть int.

struct pair_add {
  int operator()(int i, const std::pair<int, int>& x) {
    return i + x.second;
  }
};
//use as
int totalSum = accumulate(m.begin(), m.end(), 0, pair_add());

Настоящая проблема - сделать функтор как можно более универсальным.

...