С ++ накапливается как с агрегированным, так и с исходным

У меня был случай, когда я хочу накопить sum переменная во время итерации по массиву и выполнения двоичной операции на каждых двух соседях. accumulate ака reduce приходит на ум. Но я ловлю себя на том, что пишу это

  int sum = 0;
  auto result = // this result is discarded. its always the last element value
      accumulate(v.begin() + 1, v.end(), *v.begin(),
                 [&sum, &duration](int left, int right) {
                   sum += min(right - left, duration);
                   return right; // only care about the side effect in the lambda
                 });

Я думаю, что это некрасиво, но я не смог найти способ исключить дополнительную переменную сумму, используемую для отслеживания агрегированного значения. То, что я делал, равнозначно этому традиционному циклу.

  for (vector<int>::size_type i = 1; i < v.size(); i++) {
    sum += min(v[i] - v[i - 1], duration);
  }

Есть ли способ, которым я не могу использовать int sum и просто вернуть нужную сумму из функции Reduce?

некоторый ожидаемый результат

// second param is the "duration" but its not important. 
vector<int> v{1, 2, 3};
REQUIRE(foo(v, 3) == 5);
vector<int> v1{1, 2, 3};
REQUIRE(foo(v1, 1) == 3);
vector<int> v2{1, 5, 7};
REQUIRE(foo(v2, 2) == 6);

0 ответов

Другие вопросы по тегам