Это потому, что вы не используете std::accumulate
правильно. А именно, вы 1) не указали начальное значение и 2) предоставили унарный предикат вместо двоичного. Пожалуйста, проверьте документы .
Правильный способ написать то, что вы хотите, будет:
#include <iostream>
#include <numeric>
#include <string>
#include <vector>
using namespace std;
int main() {
vector<string> v = {"abc", "def", "ghi"};
size_t totalSize = accumulate(v.begin(), v.end(), 0,
[](size_t sum, const std::string& str){ return sum + str.size(); });
cout << totalSize << endl;
return 0;
}
Обе проблемы исправлены в этом коде:
0
указано в качестве начального значения, поскольку std::accumulate
необходимо знать, с чего начать, и
- Лямбда теперь принимает два параметра: накопленное значение и следующий элемент.
Также обратите внимание, как std::string
передается const ref в лямбду, в то время как вы передаете его по значению, которое приводило к копированию строки при каждом вызове, что не круто