首页 理论教育 C++函数对象-零基础C++从入门到精通

C++函数对象-零基础C++从入门到精通

时间:2023-08-20 理论教育 版权反馈
【摘要】:动手写12.9.3动手写12.9.3展示了使用自定义比较函数的排序算法,运行结果如图12.9.3所示:图12.9.3排序算法在示例中,我们把larger()传入sort()函数其实是传了函数指针,函数参数需要与迭代器指向的元素类型匹配。

C++函数对象-零基础C++从入门到精通

在排序算法中,sort()应该算是最常用的一种算法了。在很多实际的问题中,我们都需要对容器的元素进行排序。sort()的使用与unique()相似,一个乱序的vector在排序之后,元素会从小到大排列,这也是因为sort()算法默认使用小于操作符“<”比较迭代器指向的元素。如果我们想实现按其他规则排序,也可以指定自定义的比较函数。

动手写12.9.3

动手写12.9.3展示了使用自定义比较函数的排序算法,运行结果如图12.9.3所示:

图12.9.3 排序算法

在示例中,我们把larger()传入sort()函数其实是传了函数指针,函数参数需要与迭代器指向的元素类型匹配。

sort()的第三个参数也不是只能传函数,也可以传一种叫作函数对象(Function Object)的类对象。函数对象实现了调用操作符,可以像函数一样使用,但也能有其他的成员变量来充当额外返回值或参数,也可以有辅助用的其他成员函数。接下来我们看一个在sort()中使用函数对象的示例:(www.xing528.com)

动手写12.9.4

动手写12.9.4展示了函数对象的用法,运行结果如图12.9.4所示:

图12.9.4 函数对象

在这个程序中,我们在基类Comparator的基础上定义了小于比较和大于比较两个函数对象,分别可以在排序算法中实现升序和降序的排序。重载调用操作符的函数基本与动手写12.9.3中的函数相似,除了函数名换成了operator()。将函数对象传入sort()函数的时候,在后面跟着的括号不是使用调用操作符的意思,而是调用默认构造函数。在动手写12.9.3中我们也只传了函数指针,而没有带任何参数。虽然在程序中我们没有使用基类中定义的diff,但是我们看到diff可以用来存放最新一次比较中的两个值的绝对值的差。像这种几个类似函数对象中都会用到的变量,我们就可以灵活地提取出来并放到基类中去,这是函数所不能做到的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈