STL——容器(Set & multiset)之 仿函数(函数对象)functor 的用法

Set/multiset 中元素的存储数据总是会按照从大到小或者从小到大排列,这个是怎么实现的?这就要说 “仿函数” 这个概念了。

 

仿函数概念

1. 尽管函数指针被广泛用于实现函数回调,但C++还提供了一个重要的实现回调函数的方法,那就是函数对象。

2. functor,翻译成函数对象,伪函数,它是是重载了“()”操作符的普通类对象。从语法上讲,它与普通函数行为类似。

3. functional 头文件中包含的 greater<> 与 less<> 就是函数对象。

下面举出 greater<int> 和 less<int> 的简易实现原理,set/setmulti 容器就是调用函数对象的 operator() 方法去比较两个值的大小。

因为重载了(),greater 或 less 这两个函数对象(别纠结这是struct 还是 class),你完全可以吧他们当做函数去使用,

 1 struct greater
 2 {
 3   bool operator()(const int& iLeft, const int& iRight)
 4   {
 5        return (iLeft>iRight);   
 6   }
 7 }
 8 
 9 struct less
10 {
11   bool operator()(const int& iLeft, const int& iRight)
12   {
13        return (iLeft<iRight);    
14   }
15 }

 

在 Set/multiset 的源码中默认有 greater<> 与 less<>  的调用,如下:

STL——容器(Set & multiset)之 仿函数(函数对象)functor 的用法

上图这是一个类模板,其53行就是这个模板的参数列表,less其实是一个结构体,但他 operator 了括号,我们可以把当做函数去使用,它包含在头文件 <functional> 中,他是一个比较函数,其原型:

STL——容器(Set & multiset)之 仿函数(函数对象)functor 的用法

第126行便是其重载,如果左值小于右值便返回 True 否则返回 False。

第108行-117行便是 greater<> 的实现。每次传参数进来,用现有左值与右值比较,如果判断结果为 True 或False 便将值放置到左边或者右边。

 

 

 

 

 

 

 

=======================================================================================================================

原文链接: https://www.cnblogs.com/CooCoChoco/p/12953439.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    STL——容器(Set & multiset)之 仿函数(函数对象)functor 的用法

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/350612

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午6:24
下一篇 2023年3月2日 上午6:25

相关推荐