我想知道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_1
和var_2
。对于其他谓词,结构中可能存在不同的变量。
如果通过引用或指针传递,这对我来说是非常合理的。
非常感谢!
答案 0 :(得分:1)
(我希望我不会误解你的问题。)
可以通过值传递的原因是' my_predicate' struct具有由编译器自动生成的隐式复制构造函数。您可以按值传递它,因为它有一个复制构造函数。
实际上,编译器很可能会优化副本。事实上,编译器很可能会优化掉整个谓词对象,例如在std :: copy_if的情况下,将代码减少到等于for循环+ if语句。
按照惯例,谓词按值传递。它们并不意味着是重量级的物体,对于小物体来说,即使整个谓词没有被优化掉,也无论如何都要更快地通过值。
通常,您不能通过非const引用(更不用说指针)传递临时值,所以:
std::copy_if(begin(..),end(..),my_predicate{});
不会编译,因为你的谓词不是const函数。通过价值传递,你可以逃脱这一点。