2017-04-25 71 views
0

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

根据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。对于其他谓词,结构中可能有不同的变量。

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

非常感谢!

+0

请注意,大多数谓词包含* no *变量。通过一无所有将是相当浪费。 –

+0

现在“首选”的方式是通过转发参考。 – Jarod42

回答

1

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

为什么它可以按值传递的原因是“my_predicate”结构具有由编译器自动生成一个隐含的拷贝构造函数。你可以通过值传递它,因为它有一个拷贝构造函数。

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

按约定谓词是按值传递的。即使整个谓词没有被优化,它们并不意味着成为重量级的对象和小对象,但是无论如何,它的传递速度更快。

而且通常无法通过非const引用(更不用说指针),所以通过临时值:

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

不会编译为您的谓语不是一个const函数。随着价值传递,你可以逃避这一点。

+0

非常感谢!这是我正在寻找的答案! – SuperBald