在stl算法中使用函数对象

Using function object in stl algorithm

当尝试使用条件 copy_if 算法仅将向量中低于平均值的值复制到另一个向量时,我的函数对象遇到了问题:

struct Lower_than_mean
{
private:
    double mean;
    vector<double>d1;
public:
    Lower_than_mean(vector<double>a)
        :d1{a}
    {
        double sum = accumulate(d1.begin(), d1.end(), 0.0);
        mean = sum / (d1.size());
    }
    bool operator()(double& x)
    {
        return x < mean;
    }

};

int main()
{
    vector<double>vd{ 3.4,5.6, 7, 3,4,5.6,9,2 };
    vector<double>vd2(vd.size());

    copy_if(vd.begin(), vd.end(), vd2, Lower_than_mean(vd));

}

解决这个问题的正确方法是什么?

您在 std::copy_if 的调用中使用了 vd 而不是 vd.begin()

但是,严重的是,您甚至没有费心阅读编译器输出...

此外,就像@zch 建议的那样——您的方法没有意义:不要一次又一次地保持 re-calculating 平均值。相反,计算一次,然后你的函数就变得很简单 [mean](double x) { return x < mean; } lambda.