关于c++;stl谓词 我想知道C++ STL谓词是如何实现的?例如,在copy_if()中

关于c++;stl谓词 我想知道C++ STL谓词是如何实现的?例如,在copy_if()中 ,c++,stl,C++,Stl,根据有效STL,谓词通过值传递。对于int的以下代码 struct my_predicate{ int var_1; float var_2; bool operator()(const int& arg){ // some processing here } } 关于my_谓词的传递值,copy_if()是如何实现的?这里有var_1和var_2。对于其他谓词,结构中可能有不同的变量 如果通过引用或指针传递,这对我来说是非常合理的 非常

根据有效STL,谓词通过值传递。对于int的以下代码

struct my_predicate{
    int var_1;
    float var_2;

    bool operator()(const int& arg){
       // some processing here
    }
}
关于my_谓词的传递值,
copy_if()
是如何实现的?这里有
var_1
var_2
。对于其他谓词,结构中可能有不同的变量

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

非常感谢

(我希望我没有误解你的问题。)

它可以按值传递的原因是“my_谓词”结构具有由编译器自动生成的隐式复制构造函数。您可以按值传递它,因为它有一个复制构造函数

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

按约定谓词是按值传递的。它们并不意味着是重量级对象,对于小对象,即使整个谓词没有优化,通过值传递也会更快

此外,通常不能通过非常量引用(更不用说指针)传递临时值,因此:

不会编译,因为谓词不是常量函数。使用pass-by-value,您可以不受影响。

(希望我没有误解您的问题。)

它可以按值传递的原因是“my_谓词”结构具有由编译器自动生成的隐式复制构造函数。您可以按值传递它,因为它有一个复制构造函数

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

按约定谓词是按值传递的。它们并不意味着是重量级对象,对于小对象,即使整个谓词没有优化,通过值传递也会更快

此外,通常不能通过非常量引用(更不用说指针)传递临时值,因此:


不会编译,因为谓词不是常量函数。使用passby value可以避免这种情况。

注意,大多数谓词根本不包含变量。传递对nothing的引用是相当浪费的。现在的“首选”方法是通过转发引用来传递。请注意,大多数谓词根本不包含变量。将引用传递给nothing是相当浪费的。现在的“首选”方式是通过转发引用来传递。非常感谢!这就是我在寻找的答案!谢谢!这就是我在寻找的答案!
std::copy_if(begin(..),end(..),my_predicate{});