c++ - 关于c++ STL谓词的实现

标签 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
    }
}

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

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

非常感谢!

最佳答案

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

之所以可以按值传递,是因为'my_predicate'结构有一个由编译器自动生成的隐式拷贝构造函数。您可以按值传递它,因为它有一个复制构造函数。

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

按照惯例,谓词按值传递。它们并不意味着是重量级对象,对于小型对象,即使没有优化整个谓词,按值传递也更快。

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

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

不会编译,因为您的谓词不是 const 函数。通过按值传递,您可以避免这种情况。

关于c++ - 关于c++ STL谓词的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43600983/

相关文章:

c++ - 如何用STL重构这段代码?

c++ - STL 容器 : Constructor's Allocator parameter and scoped allocators

c++ - 共享内存 STL 映射

c++ - 使用 fstream 读取带有 float 的 vector

c++ - 指针转换为 64 位环境中的长移植问题

c++ - 异常和 std::list 类

c++ - 如何强制库使用自定义 std::allocator?

c++ - 队列创建拷贝吗?

c++ - 需要修复 C++ 脚本(不是我的)

c++ - 移动构造函数和移动赋值