Алгоритм накопления неправильной суммы

#c

#c

Вопрос:

Только начал изучать алгоритмы на c . В моей книге упоминается простой алгоритм, доступный только для чтения, определенный в числовом заголовке. Он принимает три параметра: первый — это итераторы, которые задают диапазон или элементы для суммирования, а третий — начальное значение суммирования. Однако, когда я пытаюсь это сделать:

 #include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;

int main() {

vector<int> numbers;

//Fill vector with numbers.
for (vector<int>::size_type i = 0; i != 10; i  ) {
    numbers.push_back(i);
}

int sum = accumulate(numbers.begin(), numbers.end(), 1);
cout << numbers.size() << endl;
cout << sum << endl;

system("PAUSE");

return 0;
}
  

Я получаю результат: 10, 46. Как 10 плюс 1 может быть 46? Я не вижу здесь своей ошибки, спасибо за понимание.

Комментарии:

1. 10 плюс 1 не равно 46. И это не то, что вы добавляете.

2. Если вы хотите добавить 10 и 1, есть более простой метод : int sum = 10 1; .

3. @R.MartinhoFernandes Еще проще присвоить 11 sum 😀

Ответ №1:

http://www.cplusplus.com/reference/std/numeric/accumulate/

Ваш вектор содержит элементы 0-9 внутри, сумма которых равна 45. В качестве смещения к вашему аккумулятору вы добавляете 1. Поэтому вы получаете правильный результат 46.

Ответ №2:

Вы неправильно поняли алгоритм. std::accumulate выдает сумму элементов. Теперь вектор имеет 0-9 чисел. Итак, сумма чисел 0-9 равна 45, а добавление 1 (третий параметр, переданный алгоритму, равен 1 в вашем случае) к нему приводит к 46.

Комментарии:

1. да, я думал, что это суммирование количества элементов, а не кумулятивного значения.