С ++ накапливается как с агрегированным, так и с исходным
У меня был случай, когда я хочу накопить 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);