C++11:如何使用 accumulate / lambda 函数从字符串向量计算所有大小的总和?
C++11: how to use accumulate / lambda function to calculate the sum of all sizes from a vector of string?
对于字符串向量,return每个字符串大小的总和。
我尝试将 accumulate 与 lambda 函数一起使用(这是在 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),但是,错误是 returned:
/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;
我想知道如何修复我的代码?谢谢
那是因为你没有正确使用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;
}
这两个问题都已在此代码中修复:
0
被指定为初始值,因为std::accumulate
需要知道从哪里开始,而
- lambda 现在接受两个参数:累加值和下一个元素。
还要注意 std::string
是如何通过 const ref 传递到 lambda 中的,而你是通过值传递它的,这导致每次调用时都复制字符串,这并不酷
对于字符串向量,return每个字符串大小的总和。
我尝试将 accumulate 与 lambda 函数一起使用(这是在 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),但是,错误是 returned:
/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;
我想知道如何修复我的代码?谢谢
那是因为你没有正确使用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;
}
这两个问题都已在此代码中修复:
0
被指定为初始值,因为std::accumulate
需要知道从哪里开始,而- lambda 现在接受两个参数:累加值和下一个元素。
还要注意 std::string
是如何通过 const ref 传递到 lambda 中的,而你是通过值传递它的,这导致每次调用时都复制字符串,这并不酷