【STL】C++标准库中的函数对象(仿函数)

【STL】C++标准库中的函数对象(仿函数) 本文介绍一下 C标准库中的函数对象包括如何创建函数对象以及函数对象与容器和算法直接的用法。目录1 概述2 创建函数对象3 函数对象与容器4 函数对象与算法5 为什么优先用仿函数而不是普通函数1 概述函数对象也叫仿函数是重载了 operator()调用运算符的类型。这个运算符被称为调用运算符。C标准库主要把函数对象用作容器的排序规则以及算法的判断条件。相比普通全局函数函数对象具备两大优势函数对象可以保存内部状态普通函数只能依赖全局变量携带数据仿函数可以把数据存为成员变量闭包效果更好、更安全函数对象本身是一种类型能够作为模板参数使用std::setT, Comp、std::sort 的模板参数必须是类型普通函数只是实例无法直接填入模板而仿函数类型可以直接传入典型例子std::lessT、std::greaterT 都是标准库内置的函数对象。2 创建函数对象创建函数对象的方法定义一个类型并实现 operator()示例如下classLessThanFunctor{public:booloperator()(inta,intb){returnab;}};intmain(){LessThanFunctor less_than;inta5;intb7;boolansless_than(a,b);}main 函数最后一行演示了函数对象的调用方式。这种写法看起来像调用普通函数但本质是调用 LessThanFunctor 实例的 operator()。正是因为调用形式和普通函数高度一致它才被称为函数对象。注普通函数不能携带成员变量而仿函数可以在类里增加成员来保存运行时状态这是它最大的优势。3 函数对象与容器C标准库在头文件 functional 中提供了一系列内置函数对象。它们典型的用途之一就是为容器提供排序规则。以 set 容器的声明为例第二个模版函数是函数对象 less。如果第一个参数小于第二个参数则此函数对象返回 true。因为某些容器对其元素进行排序所以容器需要一种方法来比较两个元素。该比较通过使用函数对象执行。你可以创建函数对象并在容器的模板列表中指定它从而定义你自己的排序条件。4 函数对象与算法函数对象的另一大用途是配合标准算法使用。以 remove_if 算法的声明为例remove_if 的最后一个参数是返回布尔值的函数对象也叫谓词。如果函数对象调用的结果是 true则对应的元素就会被移除被移动到 remove_if 返回的新尾迭代器之后。既可以使用在 functional 头文件里预定好的函数对象作为 pred也可以自己编写自定义函数对象。5 为什么优先用仿函数而不是普通函数仿函数可以携带成员变量保存条件灵活性更强类型匹配更稳定更容易触发编译器优化