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

Posted coocochoco

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL——容器(Set & multiset)之 仿函数(函数对象)functor 的用法相关的知识,希望对你有一定的参考价值。

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

 

仿函数概念

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

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

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

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

 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<>  的调用,如下:

技术图片

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

技术图片

 

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

第131行-140行便是 greater<> 的原型

 

 

 

 

 

 

 

 

 

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

以上是关于STL——容器(Set & multiset)之 仿函数(函数对象)functor 的用法的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL set和multiset的使用

STL——容器(Set & multiset)的迭代器

STL——容器(Set & multiset)的迭代器

STL map&set用法详解

STL map&set用法详解

STL——容器(Set & multiset)的删除 erase