在 C++ 中使用累积函数作为参数

问题描述

我找不到任何解决方案,所以我发布了一个主题。 我必须使用带有 const 函数的累加作为参数(为测试做一些练习):

  1. get_skills() - 返回技能列表,定义为:

    const vector<string>& get_skills() const;
    
  2. 我必须返回所有技能长度的总和

我尝试过的:

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; });

std::accumulate - Parameters

操作 - ...
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 的第一个参数,一个字符串。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...