IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++仿函数(函数对象) -> 正文阅读

[C++知识库]C++仿函数(函数对象)

仿函数(函数对象)

研究set/multiset容器的排序原理。

当我们构造一个存放int类型的set容器时

set<int> s1;

系统会自动帮我们设定并调用一个函数,自动调用头文件functional中的仿函数(一个类中重载了()实现了对比的操作,从而完成了排序)。

set<int,less<int>> s1;

less函数对象实现比较,为排序提供依据。(升序)
greater(降序)

functional中,如图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n2y3WzyW-1632820236223)(01仿函数functor.assets/image-20210928153035870.png)]

手动实现:

#include<iostream>
#include<set>
using namespace std;
class Student
{
public:
	Student(int _age):age(_age)
	{

	}
	int getAge()const
	{
		return age;
	}
	bool operator < (const Student& right) const {
		return this->age < right.age;
	}

	bool operator > (const Student& right) const {
		return this->age > right.age;
	}

	~Student() { } 
private:
	int age;
};

int main(void)
{
	set<Student,greater<Student>> setStu;
	setStu.insert(19);
	setStu.insert(20);
	setStu.insert(18);
	

	for (set<Student>::iterator it = setStu.begin(); it != setStu.end(); it++)
	{
		cout << it->getAge()<< endl;
	}
	
	return 0;
}

如果一个类将()运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象。函数对象是一个对象,但是使用的形式看起来像函数调用,实际上也执行了函数调用,因而得名。——C++函数对象详解

实现自己的less(greater)达到效果:

class FuncStudent
{
public:
	bool operator()(const Student& left, const Student& right)const
	{
		return left.getAge() > right.getAge();
	}
};
int main(void)
{
	set<Student,FuncStudent> setStu;
	Student s1(12);
	Student s2(13);
	setStu.insert(s1);
	setStu.insert(s2);
	
	for (set<Student,FuncStudent>::iterator it = setStu.begin(); it != setStu.end(); it++)
	{
		cout << it->getAge()<< endl;
	}
	
	return 0;
}

仿函数(函数对象)概念

  1. 尽管函数指针被广泛用于实现函数回调,但C++还提供了一个重要的实现回调函数的方法,那就是函数对象。回调函数解释——回调函数
  2. functor,翻译成函数对象,伪函数,它是是重载了“()”操作符的普通类对象。从语法上讲,它与普通函数行为类似。
  3. functional头文件中包含的 greater<>与less<>就是函数对象。

set/setmulti容器就是调用函数对象的operator()方法去比较两个值的大小,从而实现的排序。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-29 10:03:43  更:2021-09-29 10:05:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:43:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码