Я хочу знать, почему нужен std::accumulate
(aka reduce) третий параметр. Для тех, кто не знает, что такое accumulate
, он используется так:
vector<int> V{1,2,3};
int sum = accumulate(V.begin(), V.end(), 0);
// sum == 6
Вызов accumulate
эквивалентен:
sum = 0; // 0 - value of 3rd param
for (auto x : V) sum += x;
Существует также необязательный 4-й параметр, который позволяет заменить дополнение любой другой операцией.
Обоснование, которое я слышал, состоит в том, что если вам нужно позволить сказать, что не складывать, а умножать элементы вектора, нам нужно другое (ненулевое) начальное значение:
vector<int> V{1,2,3};
int product = accumulate(V.begin(), V.end(), 1, multiplies<int>());
Но почему бы не сделать Python - установить начальное значение для V.begin()
и использовать диапазон, начинающийся с V.begin()+1
. Что-то вроде этого:
int sum = accumulate(V.begin()+1, V.end(), V.begin());
Это будет работать для любого op. Почему необходим третий параметр?