关于c ++ stl谓词的实现

时间:2017-04-25 03:16:33

标签: c++ stl

我想知道c ++ stl谓词是如何实现的?例如在copy_if()中 http://www.cplusplus.com/reference/algorithm/copy_if/

根据Effective STL,谓词按值传递。对于int的以下代码,

struct my_predicate{
    int var_1;
    float var_2;

    bool operator()(const int& arg){
       // some processing here
    }
}

copy_if()如何实现传递my_predicate的值?此处有var_1var_2。对于其他谓词,结构中可能存在不同的变量。

如果通过引用或指针传递,这对我来说是非常合理的。

非常感谢!

1 个答案:

答案 0 :(得分:1)

(我希望我不会误解你的问题。)

可以通过值传递的原因是' my_predicate' struct具有由编译器自动生成的隐式复制构造函数。您可以按值传递它,因为它有一个复制构造函数。

实际上,编译器很可能会优化副本。事实上,编译器很可能会优化掉整个谓词对象,例如在std :: copy_if的情况下,将代码减少到等于for循环+ if语句。

按照惯例,谓词按值传递。它们并不意味着是重量级的物体,对于小物体来说,即使整个谓词没有被优化掉,也无论如何都要更快地通过值。

通常,您不能通过非const引用(更不用说指针)传递临时值,所以:

std::copy_if(begin(..),end(..),my_predicate{});

不会编译,因为你的谓词不是const函数。通过价值传递,你可以逃脱这一点。