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 的用法的主要内容,如果未能解决你的问题,请参考以下文章