13.6 泛型算法
本节讨论的算法不是指容器的成员函数,而是STL类库中提供的一些通用的非成员函数操作。算法是STL的重要组成部分,是处理容器中数据的方法和操作。这些算法可应用于多种容器类型中,因此称为“泛型”。泛型算法不是针对容器编写的,而只是单独依赖迭代器和迭代器操作来实现的。
使用泛型算法必须先包含algorithm头文件,使用泛化的算术算法则必须包含numeric头文件,如下所示。
#include<algorithm> #include<numeric>
在介绍算法前,先讲解函数对象的概念。
13.6.1 什么是函数对象
在第7章中介绍了指向函数的指针这个概念,使得函数可以作为参数传递给另一个函数,在第9章中又介绍了函数调用操作符的重载,它在程序中可以使用诸如“对象名(参数表)”的形式,实际上上述两个概念都属于函数对象。
函数对象是可以以函数方式与()结合使用的任意对象,包括以下内容。
❑函数名。
❑指向函数的指针。
❑重载了()操作符的类对象,即定义了函数operator的类。
STL定义了一组函数对象,分为算术运算(Arithmetic)、关系元素(Relational)和逻辑运算(Logical)3大类,在使用这些函数对象前,必须包含相应的头文件<functional>,如下所述。
❑6个算术运算:plus<type>、minus<type>、negate<type>、multiplies<type>、divides<type>和modules<type>。
❑6个关系运算:less<type>、less_equal<type>、greater<type>、greater_equal<type>、equal_to<type>和not_equal_to<type>。
❑3个逻辑运算,分别对应于&&、!和!:logical_and<type>、logical_or<type>和logical_not<type>。
常用下列规则对函数对象进行分类。
1.生成器(Generator)
不用参数就可以调用的函数对象。
2.一元函数(Unary Function)
用一个参数就可以调用的函数对象。
3.二元函数(Binary Function)
用两个参数就可以调用的函数对象。
需注意将返回bool值的一元函数称为一元断言(Predicate),简称断言;将返回bool值的二元函数是二元断言(Binary Predicate)。