C++ 函子与字符串向量

C++ 函子与字符串向量,c++,functor,C++,Functor,我不熟悉函子的主题,所以我希望这个问题是建设性的 我有一个字符串数组()。我需要借助函子计算这些字符串的长度之和 我的代码: class LengthFinder{ private: size_t sum; public: LengthFinder():sum(0){} void operator()(string elem) { sum += elem.size(); } operator int

我不熟悉函子的主题,所以我希望这个问题是建设性的

我有一个字符串数组()。我需要借助函子计算这些字符串的长度之和

我的代码:

class LengthFinder{
    private:
        size_t sum;
    public:
        LengthFinder():sum(0){}

    void operator()(string elem)
    {
        sum += elem.size();
    }
    operator int()
    {
        return sum;
    }

};

int main(int argc, char* argv[])
{
    vector< string > array;
    array.push_back("string");
    array.push_back("string1");
    array.push_back("string11");

    string elem;
    int sum = std::for_each(array.begin(), array.end(), LengthFinder(/*??*/));
    return 0;
}
类长度查找器{
私人:
大小和;
公众:
LengthFinder():和(0){}
void运算符()(字符串元素)
{
总和+=元素大小();
}
运算符int()
{
回报金额;
}
};
int main(int argc,char*argv[])
{
向量数组;
数组。推回(“字符串”);
数组。推回(“string1”);
数组。推回(“string11”);
弦元素;
int sum=std::for_each(array.begin()、array.end()、LengthFinder(/*??*/);
返回0;
}

我应该向LengthFinder()传递什么来获取每个字符串并确定其大小?

不要为此使用
。它可以被迫完成这项工作,但这是相当多的额外工作,因为它不是真正适合这项工作的工具

您想要使用的是
std::acculate
,它是为您正在做的事情而构建的

struct length : std::binary_function<size_t, size_t, std::string> {
    size_t operator()(size_t a, std::string const &b) { 
        return a+b.length();
    }
};

// ...
int sum = std::accumulate(array.begin(), array.end(), 0, length());
struct length:std::binary_函数{
size_t运算符()(size_t a,std::string const&b){
返回a+b.length();
}
};
// ...
int sum=std::累加(array.begin(),array.end(),0,length());

不要为此使用
。它可以被迫完成这项工作,但这是相当多的额外工作,因为它不是真正适合这项工作的工具

您想要使用的是
std::acculate
,它是为您正在做的事情而构建的

struct length : std::binary_function<size_t, size_t, std::string> {
    size_t operator()(size_t a, std::string const &b) { 
        return a+b.length();
    }
};

// ...
int sum = std::accumulate(array.begin(), array.end(), 0, length());
struct length:std::binary_函数{
size_t运算符()(size_t a,std::string const&b){
返回a+b.length();
}
};
// ...
int sum=std::累加(array.begin(),array.end(),0,length());
如问题的原始海报所述:


解决方案:

LengthFinder的参数不应包含任何内容:

 int sum = std::for_each(array.begin(), array.end(), LengthFinder());
正如问题的原始海报所述:


解决方案:

LengthFinder的参数不应包含任何内容:

 int sum = std::for_each(array.begin(), array.end(), LengthFinder());

你试过运行你的代码吗?你想在LengthFinder中添加什么?你不必做任何事情。只需
LengthFinder()
为每个
创建一个临时实例,并在该实例中为每个
调用
操作符()
方法。但是,您可能需要将
操作符()
的参数改为常量引用,即
void操作符()(const std::string&elem)
。致@Joachim Pileborg:非常感谢!LengthFinder()确实可以在没有参数的情况下工作!)哦,顺便说一下,除了Jerry Coffin的答案,你可能还想读一点,这是一个新特性,它使函子几乎过时。你试过运行你的代码吗?你想在LengthFinder中添加什么?你不必做任何事情。只需
LengthFinder()
为每个
创建一个临时实例,并在该实例中为每个
调用
操作符()
方法。但是,您可能需要将
操作符()
的参数改为常量引用,即
void操作符()(const std::string&elem)
。致@Joachim Pileborg:非常感谢!LengthFinder()确实可以在没有参数的情况下工作!)哦,顺便说一句,除了Jerry Coffin的答案,你可能还想读一点,这是一个新的功能,使函子几乎过时。谢谢!我已经根据@Joachim Pileborg的建议更正了我的代码,现在它正在工作。你的建议正是我想要的,所以我会用它!非常感谢。我已经根据@Joachim Pileborg的建议更正了我的代码,现在它正在工作。你的建议正是我想要的,所以我会用它!