C ++ 11:如何使用累加/ lambda函数从字符串向量计算所有大小的总和?

时间:2019-05-19 16:05:12

标签: string c++11 vector lambda accumulate

对于字符串向量,返回每个字符串大小的总和。

我尝试将累加与lambda函数一起使用(这是在1行中计算所需内容的最佳方法吗?)

代码写在魔杖(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 个答案:

答案 0 :(得分:2)

那是因为您没有正确使用std::accumulate。即,您1)没有指定初始值,并且2)提供了一元谓词而不是二进制。请检查the docs

正确书写所需内容的方法是:

#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. lambda现在接受两个参数:累计值和下一个元素。

还要注意,在通过值传递const ref时std::string是如何通过const ref传递给lambda的,这导致每次调用时都进行字符串复制,这并不酷