很多STL算法都使用了function objects也叫函数对象functors,是一个对象,重载了()操作符,也就能像调用函数那样了使用这个对象了。
比如简单的sort算法:
vector<int> vec;
......
sort(vec.begin(), vec.end());
那就可以排序vec,但是如果vec装的不是int而是自定义类型呢。
如LeetCode上最喜欢用的链表数据结构:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
如果我们需要比较ListNode的大小,那么就可以用三种方法实现:
方法1 定义一个adaptor功能的数据结构
struct adaptor
{
ListNode *a;
bool operator<(adaptor n)
{
return a->val < n.a->val;
}
};
那就可以排序了:
void sortVec(vector<adaptor> &vln)
{
sort(vln.begin(), vln.end());
}
方法2 我们也可以定义一个比较函数来实现这个功能:
bool compList(const ListNode t1, const ListNode t2)
{
return t1.val < t2.val;
}
sort(vl.begin(), vl.end(), compList);
方法3 定义一个functor来实现:
struct functor
{
bool operator()(ListNode a, ListNode b)
{
return a.val < b.val;
}
};
sort(vl.begin(), vl.end(), functor());
有时候也许我们需要把一个双参数的操作函数改为单个参数的函数,那么也可以定义一个类来实现,如:
template <class T>
bool tooBig(const T & val, const T & lim)
{
return val > lim;
}
template<class T>
class TooBig2
{
private:
T cutoff;
public:
TooBig2(const T & t) : cutoff(t) {}
bool operator()(const T & v) { return tooBig<T>(v, cutoff); }
};
这样双值比较就可以如下实现了:
TooBig2<int> tB100(100);
int x;
cin >> x;
if (tB100(x)) // same as if (tooBig(x,100))
分享到:
相关推荐
10.3 标准函数对象和适配器 10.3.1 算术函数对象 1o.3.2 关系函数对象 10.3.3 逻辑函数对象 10.3.4 标准适配器 10.4 练习 第11章 线性方程组求解法 11.1 矩阵存储格式 11.1.1 满矩阵 11.1.2...
函数对象 − hash (C++11) 字符串转换 (C++17) 工具函数 pair − tuple (C++11) optional (C++17) − any (C++17) variant (C++17) 字符串库 basic_string basic_string_view (C++17) 空终止字符串: 字节 − 多...
}3. 插入迭代器适配器|函数|作用||:-||insert_iterator<Container> inserter (Container& x, Itera
14.8.3 函数对象的函数适配器 453 14.9 转换与类类型 454 14.9.1 转换为什么有用 454 14.9.2 转换操作符 455 14.9.3 实参匹配和转换 458 14.9.4 重载确定和类的实参 461 14.9.5 重载、转换和操作符 464 小结 466 ...
VC++网络适配器接口类:CNetworkAdapter源程序,内部使用Iphlpapi、Setupapi函数实现,主要封装了一些内部函数,使用者可以简单轻松地获取电脑上所有网络适配器的网络IP、网卡MAC、网卡描述、子网掩码等各种信息,...
此外,还将学习函数对象和适配器,以及它们的用法。 阅读完本书之后,你将能够了解如何扩展STL,如何定义自定义类型的C++组件,你还将能够定义既满足C++ STL要求又遵从最常见的设计模式和最佳实践的自定义类型。 ...
C/C++语言参考的索引: 基础部分: 1.预处理命令 2.操作符优先级 3.转义字符(即在定义字符串常量时需要转义的特殊字符) 4.ASCII 码表 5.基本数据类型 6.C++关键字 7.标准C的标准输入输出 8.标准c字符和...
可以将 bind 函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。 bind函数:接收一个函数名作为参数,生成一个新的函数。 auto newCallable = bind...
精通Windows Sockets网络开发——基于Visual C++实现 目 录 第1篇网络开发基础篇 第1章准备开发环境 1.1windows sockets开发概述 1.1.1网络程序开发应用 1.1.2网络程序结构——c/s、b/s 1.1.3网络程序通信基础——...
本书内容分为3部分:第1部分是STL的入门知识,介绍了STL组件,STL与其他软件库的区别,迭代器的概念,STL类属算法,序列容器,有序关联容器,函数对象及容器、迭代器和函数适配器:第2部分是综合运用篇,其中给出了...
15.2.3 C++如何实现虚函数 457 第16章 模板 461 16.1 函数模板 461 16.2 类模板 471 16.2.1 类模板的语法 471 16.2.2 C++中的模板类vector和 basic_string 478 16.3 模板和继承 478 第17章 链式数据结构 487...
C++stl高级部分思维导图,STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略变化,适配器可以修饰仿函数
2.13.3 C++/CLI特有的功能—— 格式化输出 88 2.13.4 C++/CLI的键盘输入 91 2.13.5 使用safe_cast 92 2.13.6 C++/CLI枚举 92 2.14 查看C++/CLI类型 96 2.15 小结 97 2.16 练习 97 2.17 本章主要内容 98 第3...
14.8.2 标准库定义的函数对象 509 14.8.3 可调用对象与function 511 14.9 重载、类型转换与运算符 514 14.9.1 类型转换运算符 514 14.9.2 避免有二义性的类型转换 517 14.9.3 函数匹配与重载运算符 521 ...
轻量级A星 使用模板用 C++11 编写的轻量级 A-Star 寻路实现。... exampleInheritance.cpp - 使用继承来实现适配器功能。 exampleFunctional.cpp - 使用绑定函数 (std::function<>) 来实现适配器功能。
这本经典、畅销的数据结构教材详细介绍了数据抽象的...附录H C++头文件和标准函数 751 附录I C++文档系统 755 附录J ASCII字符代码 757 附录K 针对Java编程人员的C++知识 759 附录L 针对Python编程人员的C++知识 767
C++模板库基础学习,讲解模板库中各种元素,迭代器,函数对象,适配器,容器等等,可作参考手册。
构造函数与析构函数思维导图Xmind文件和.png文件 拷贝构造思维导图xmind文件和.png文件 运算符重载思维导图xmind文件和.png文件 初始化列表、匿名对象、static成员、类的隐式类型转换和explicit关键字、内部类思维...
14.8.2 标准库定义的函数对象 509 14.8.3 可调用对象与function 511 14.9 重载、类型转换与运算符 514 14.9.1 类型转换运算符 514 14.9.2 避免有二义性的类型转换 517 14.9.3 函数匹配与重载运算符 521 ...