问题描述
我找不到任何解决方案,所以我发布了一个新主题。 我必须使用带有 const 函数的累加作为参数(为测试做一些练习):
-
get_skills() - 返回技能列表,定义为:
const vector<string>& get_skills() const;
-
我必须返回所有技能长度的总和
我尝试过的:
double sum1 = accumulate(tmpObj.get_skills().begin(),tmpObj.get_skills().end(),0.,[](const string& s,const double& sum){return s.size() + sum;});
和我一起:
no matching function for call to object of type lambda
note: candidate function not viable: no kNown conversion from 'double' to 'const std::__cxx11::string' (aka 'const basic_string<char>') for 1st argument
有人可以解释一下用作 lambda 的内容吗(我尝试使用 tmpObj& 但没有改变任何东西) 以及是什么导致“没有已知的从 'double' 到 'const std::__cxx11::string' 的转换
先谢谢你!
解决方法
不使用视图,您可以先转换为字符串长度,然后累积。视图会更好,但这很简单。
#include <string>
#include <iostream>
#include <numeric>
#include <vector>
#include <algorithm>
int main(int,char**)
{
std::vector<std::string> skills = { "a","ab","abc" };
std::vector<std::size_t> lengths;
// transform to string lengths first
std::transform(
skills.begin(),skills.end(),std::back_inserter(lengths),[](const std::string& s){ return s.size(); }
);
// then accululate
std::size_t sum = std::accumulate(lengths.begin(),lengths.end(),0);
std::cout << "sum = " << sum << '\n';
return 0;
}
附言我应该补充一点,如果这样做,您也可以手动进行,但我想根据问题给出一个带有 acculate 的示例。
,比较时
double sum1 = std::accumulate(tmpObj.get_skills().begin(),tmpObj.get_skills().end(),0.,[](const string &s,const double &sum)
{ return s.size() + sum; });
操作 - ...
ret fun(const Type1 &a,const Type2 &b);
和
Type1 - T
Type2 - 迭代器
可以看到,二元运算符的第一个参数必须对应返回类型(double,sum
),第二个运算符必须对应容器的类型(std::string
),例如
[](double sum,const std::string &s) { return sum + s.size(); }
这也是编译器抱怨的原因
没有已知的从 'double' 到 'const std::__cxx11::string' 的转换
它不能将 sum(double)转换为 lambda 的第一个参数,一个字符串。