`
jgsj
  • 浏览: 960996 次
文章分类
社区版块
存档分类
最新评论

C++适配器功能实现及函数对象

 
阅读更多

很多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))

分享到:
评论

相关推荐

    C++和面向对象数值计算

    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...

    c++参考手册 2018版

    函数对象 − 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) 空终止字符串: 字节 − 多...

    C++进阶STL适配器总结1

    }3. 插入迭代器适配器|函数|作用||:-||insert_iterator&lt;Container&gt; inserter (Container& x, Itera

    C++ Primer第四版【中文高清扫描版】.pdf

    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++网络适配器接口类源程序

    VC++网络适配器接口类:CNetworkAdapter源程序,内部使用Iphlpapi、Setupapi函数实现,主要封装了一些内部函数,使用者可以简单轻松地获取电脑上所有网络适配器的网络IP、网卡MAC、网卡描述、子网掩码等各种信息,...

    C++标准模板库编程实战.pdf.zip

    此外,还将学习函数对象和适配器,以及它们的用法。 阅读完本书之后,你将能够了解如何扩展STL,如何定义自定义类型的C++组件,你还将能够定义既满足C++ STL要求又遵从最常见的设计模式和最佳实践的自定义类型。 ...

    c++语言参考速查工具

    C/C++语言参考的索引: 基础部分: 1.预处理命令 2.操作符优先级 3.转义字符(即在定义字符串常量时需要转义的特殊字符) 4.ASCII 码表 5.基本数据类型 6.C++关键字 7.标准C的标准输入输出 8.标准c字符和...

    c/c++ 标准库 bind 函数详解

    可以将 bind 函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。 bind函数:接收一个函数名作为参数,生成一个新的函数。 auto newCallable = bind...

    精通Windows Sockets网络开发:基于Visual C++实现-带源码

    精通Windows Sockets网络开发——基于Visual C++实现 目 录 第1篇网络开发基础篇 第1章准备开发环境 1.1windows sockets开发概述 1.1.1网络程序开发应用 1.1.2网络程序结构——c/s、b/s 1.1.3网络程序通信基础——...

    [pdf格式]标准模板库自修教程与参考手册-STL进行C++编程(第二版)

    本书内容分为3部分:第1部分是STL的入门知识,介绍了STL组件,STL与其他软件库的区别,迭代器的概念,STL类属算法,序列容器,有序关联容器,函数对象及容器、迭代器和函数适配器:第2部分是综合运用篇,其中给出了...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    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.xmind

    C++stl高级部分思维导图,STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略变化,适配器可以修饰仿函数

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    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...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/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 ...

    Lightweight-A-Star:使用模板以 C++11 编写的轻量级仅标头 A* 寻路算法实现。 基于图和节点适配器

    轻量级A星 使用模板用 C++11 编写的轻量级 A-Star 寻路实现。... exampleInheritance.cpp - 使用继承来实现适配器功能。 exampleFunctional.cpp - 使用绑定函数 (std::function&lt;&gt;) 来实现适配器功能。

    C++数据抽象和问题求解(第6版).[美]Frank M. Carrano(带详细书签).pdf

    这本经典、畅销的数据结构教材详细介绍了数据抽象的...附录H C++头文件和标准函数 751 附录I C++文档系统 755 附录J ASCII字符代码 757 附录K 针对Java编程人员的C++知识 759 附录L 针对Python编程人员的C++知识 767

    C++模板库基础学习

    C++模板库基础学习,讲解模板库中各种元素,迭代器,函数对象,适配器,容器等等,可作参考手册。

    C++思维导图Xmind文件和.png文件(持续更新)

    构造函数与析构函数思维导图Xmind文件和.png文件 拷贝构造思维导图xmind文件和.png文件 运算符重载思维导图xmind文件和.png文件 初始化列表、匿名对象、static成员、类的隐式类型转换和explicit关键字、内部类思维...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     14.8.2 标准库定义的函数对象 509  14.8.3 可调用对象与function 511  14.9 重载、类型转换与运算符 514  14.9.1 类型转换运算符 514  14.9.2 避免有二义性的类型转换 517  14.9.3 函数匹配与重载运算符 521 ...

Global site tag (gtag.js) - Google Analytics