【问题标题】:Using function object in stl algorithm在 stl 算法中使用函数对象
【发布时间】:2018-09-18 07:29:02
【问题描述】:

当尝试使用条件 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));

}

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

【问题讨论】:

  • 你遇到了什么样的“障碍”?
  • 复制并保存整个向量,当你只使用平均值时似乎很浪费。

标签: c++ c++11 stl stl-algorithm


【解决方案1】:

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

但是,说真的,你甚至没有费心去阅读你的编译器输出......

另外,就像@zch 建议的那样——你的方法没有意义:不要一次又一次地重新计算平均值。相反,计算一次,然后你的函数就变得像[mean](double x) { return x &lt; mean; } lambda 一样简单。

【讨论】:

  • 啊谢谢!!...我不知道我是怎么错过 vd.begin() 部分的。然后我复制向量的部分只是因为大小不会太大large 以产生任何大的影响。而且我认为函数对象中的平均值可以让我将 Lower_than_mean 函数用于其他 vector 容器......或者我错了吗?
  • 是的,你错了。只需在不同位置创建另一个具有不同预计算平均值的 lambda-closure。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
相关资源
最近更新 更多