C ++ 11: как использовать функцию накопления / лямбды для вычисления суммы всех размеров из вектора строки? - PullRequest
1 голос
/ 19 мая 2019

Для вектора строк вернуть сумму размера каждой строки.

Я пытался использовать накопление вместе с лямбда-функцией (это лучший способ вычисления того, что я хочу в 1-строчной строке?)

Коды написаны в wandbox (https://wandbox.org/permlink/YAqXGiwxuGVZkDPT)

#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(), [](string s){return s.size();});
    cout << totalSize << endl;

    return 0;
}

Я ожидаю получить число (9), однако возвращаются ошибки:

/ opt / wandbox / gcc-head / include / c ++ / 10.0.0 / bits / stl_numeric.h: 135: 39: примечание: 'std :: __ cxx11 :: basic_string' не является производным от 'const __gnu_cxx :: __normal_iterator <_Iterator, _Container> ' 135 | __init = _GLIBCXX_MOVE_IF_20 (__ init) + * __ first;

Я хочу знать, как исправить мои коды? Спасибо.

1 Ответ

2 голосов
/ 19 мая 2019

Это потому, что вы не используете 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;
}

Обе проблемы исправлены в этом коде:

  1. 0 указано в качестве начального значения, поскольку std::accumulate необходимо знать, с чего начать, и
  2. Лямбда теперь принимает два параметра: накопленное значение и следующий элемент.

Также обратите внимание, как std::string передается const ref в лямбду, в то время как вы передаете его по значению, которое приводило к копированию строки при каждом вызове, что не круто

...