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

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

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

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

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

STL——容器(Set & multiset)之 仿函数(函数对象)functor 的用法的更多相关文章

  1. C++进阶 STL(2) 第二天 一元/二元函数对象、一元/二元谓词、stack容器、queue容器、list容器(双向链表)、set容器、对组、map容器

    01 上次课程回顾 昨天讲了三个容器 string  string是对char*进行的封装 vector 单口容器 动态数组 deque(双端队列) 函数对象/谓词: 一元函数对象: for_each ...

  2. STL基础--仿函数(函数对象)

    1 首先看个仿函数的例子 class X { public: void operator()(string str) { // 函数调用运算符,返回类型在operator之前 cout << ...

  3. STL Set和multiset 容器

    STL Set和multiset 容器 set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列. 元素插入过程是按排序规则插入,所以不能指定插入位 ...

  4. STL - set和multiset

    set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. set采用红黑树变体的数据结构实现, ...

  5. 【实习记】2014-08-15文档太少看着源码用cgicc+stl库之模板谓词函数对象

        总结1: 今天找到了昨天scanf的问题答案,scanf与printf一样的神奇而复杂,稍不留神,就会被坑.scanf函数在读入非空白符分割的多个字符串的解决方法是这个:/* 以 | 分割 * ...

  6. STL_函数对象01

    1.自定义函数对象 1.1.简单例子: //函数对象 struct StuFunctor { bool operator() (const CStudent &stu1, const CStu ...

  7. Python--day12(三元表达式、函数对象、名称空间与作用域、函数嵌套定义)

    今日主要内容 1.  函数默认值细节(*) 2.  数据类型补充:三元表达式.列表推导式.字典推导式 (***) 3.  函数对象:函数名的各种应用场景 (*****) 4.  名称空间与作用域:解释 ...

  8. day12函数,三元表达式 ,列表推导式 ,字典推导式,函数对象,名称空间与作用域,函数的嵌套定义

    复习 # 字符串的比较 # -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 # 函数的参数 # 1)实参与形参: # -- 形参:在函数定义时()中出现的参数 # -- 实参:在函 ...

  9. day-12函数对象

    函数默认值的细节 如果函数的默认参数的默认值为变量,在所属函数定义阶段一执行就被确定为当时变量存放的值,后面变化不会再变化 a = 100 def fn(num=a): a = 200 fn() 三元 ...

  10. day_12函数默认值,数据类型的补充,函数对象名称空间与作用域,函数的嵌套定义

    复习, 昨天讲了字符串的比较,按照从左往右比较每一个字符,通过字符对应的ASCII码进行比较 函数的参数,‘ 实参与形参 形参:在函数定义时()中出现的参数 实参,在函数调用时()中出现的参数 实参的 ...

随机推荐

  1. 《JavaScript高级程序设计》读书笔记 ---继承

    继承是OO 语言中的一个最为人津津乐道的概念.许多OO 语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScrip ...

  2. 深入理解r2dbc-mysql

    目录 简介 r2dbc-mysql的maven依赖 创建connectionFactory 使用MySqlConnectionFactory创建connection 执行statement 执行事务 ...

  3. kali 更新msf

    用leafpad打开,方便复制粘贴 leafpad /etc/apt/sources.list 然后复制下面的源覆盖原本的 deb http://mirrors.ustc.edu.cn/kali ka ...

  4. 常用命令合集『Postgres、Redis、Docker等等』每周更新,建议收藏备用

    Command CMD POSTGRES 进入数据库命令行 psql -U 用户名 -d 数据库名 psql -U example -d exampledb 导出数据库 pg_dump -U 用户名 ...

  5. 【VUE】2.渲染组件&重定向路由

    1.删除多余组件,使环境赶紧 1. 整理App.vue, 删除多余内容,在template 模板区域增加一个路由占位符 router-view:渲染路径匹配到的视图组件 <template> ...

  6. Java设计模式——观察者模式的灵活应用

    灵感来源于一个猪队友给我的题目 看到这个,我抓住的关键字是:任何子任务失败,要通知所有子任务执行取消逻辑. 这不就是消息广播吗?观察者模式! 干活 首先是收听者 package com.example ...

  7. Nginx添加fastdfs-nginx-module模块

    系统:Ubuntu 20.04 Nginx版本:1.18.0 要添加的模块:fastdfs-nginx-module 思路:configure参数下包括Nginx已安装的模块信息,通过编辑config ...

  8. Java继承的两道实验题目

    设计一个表示二维平面上点的类Point,包含有表示坐标位置的Protect类型的成员变量 获取和设置x和y值的public方法 package classwork_6; public class Po ...

  9. Python爬虫入门(二)之Requests库

    Python爬虫入门(二)之Requests库 我是照着小白教程做的,所以该篇是更小白教程hhhhhhhh 一.Requests库的简介 Requests 唯一的一个非转基因的 Python HTTP ...

  10. 「考试」联赛模拟36-39,noip晚间小测2-3

    36.1 party(CF623D) 很是鸡贼的一道题 首先要明确一点,抓人是有策略,而不是随机的,可以认为等同于按一个给定的顺序猜人,那么这时猜中的概率就只是抓住这个人的概率了 对于每一次猜测,因为 ...