`

第六章 通用算法

阅读更多

函数对象

函数对象是重载了operator()的类的一个实例,operator()是函数调用运算符。这个运算符允许用函数调用语法并使用对象。如同其他对象一样,可以通过该对象的构造函数来初始化它。

//: C06:GreaterThanN.cpp
#include <iostream>
using namespace std;
 
class gt_n {
  int value;
public:
  gt_n(int val) : value(val) {}
  bool operator()(int n) { return n > value; }
};
 
int main() {
  gt_n f(4);
  cout << f(3) << endl;  // Prints 0 (for false)
  cout << f(5) << endl;  // Prints 1 (for true)
} ///:~
当创建函数对象f时,传递作为比较对照的固定值(4).编译器像下面的函数调用一样计算表达式f(3);
f.operator()(3);
函数对象的分类:
根据operator()使用参数的个数分别为零个,一个或两个的情况进行。
发生器(Generator):一种没有参数且返回一个任意类型值的函数对象。
一元函数(Unary Function):一种只有一个任意类型的参数,且返回一个可能不同类型(比如可能是void)值的函数对象。
二元函数(Binary Function):一种有两个任意类型的(可能是不同类型)参数,且返回一个任意类型(包括void)值的函数对象。
一元判定函数(Unary Predicate):返回bool型值的一元函数。
二元判定函数(Binary Predicate):返回bool型值的二元函数。
<style type="text/css"> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }</style>

自动创建函数对象

例用<functional>定义的大量有用的通用函数对象,在大多数情况下,无需编写任何函数就可以构造出复杂的判定函数。可以用函数对象适配器(function object adaptor)来获得一个简单的函数对象,并且调整它们用来与操作链中的其他函数对象配合。

以下为一个如何利用函数对象适配器来自动创建适当的函数对象:

//: C06:CopyIntsToFile.cpp
// Uses an output file stream iterator.
#include <algorithm>
#include <cstddef>
#include <fstream>
#include <iterator>
using namespace std;
 
bool gt15(int x) { return 15 < x; }
 
int main() {
  int a[] = { 10, 20, 30 };
  const size_t SIZE = sizeof a / sizeof a[0];
  ofstream outf("ints.out");
  remove_copy_if(a, a + SIZE,
                 ostream_iterator<int>(outf, "\n"), gt15);
} ///:~
<style type="text/css"> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }</style>

以下的程序没用前面用户自己定义的判定函数gt15(),却产生了相同的结果。函数对象适配器bind2nd()是一个模板函数,它创建一个binder2nd类型的函数对象。仅存储和传递两个参数给bind2nd(),其中第1个参数必须是一个二元函数或函数对象(即带有两个参数的可以被调用的任意对象)。binder2nd中的operator()函数,它本身是一个一元函数,该函数调用存储的二元函数,并传递引入的参数及其存储的固定值。

//: C06:CopyInts4.cpp
// Uses a standard function object and adaptor.
#include <algorithm>
#include <cstddef>
#include <functional>
#include <iostream>
#include <iterator>
using namespace std;
 
int main() {
  int a[] = { 10, 20, 30 };
  const size_t SIZE = sizeof a / sizeof a[0];
  remove_copy_if(a, a + SIZE,
                 ostream_iterator<int>(cout, "\n"),
                 bind2nd(greater<int>(), 15));
} ///:~
<style type="text/css"> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }</style>
分享到:
评论

相关推荐

    C++编程思想之第2卷

    第2卷:实用编程技术 出版者的话 专家指导委员会 ...第6章 通用算法 第7章 通用容器 第三部分 专题 第8章 运行时类型识别 第9章 多重继承 第10章 设计模式 第11章 并发 附录 附录A 推荐读物 附录B 其他 索引

    C++编程思想(第二卷)

    C++编程思想(第二卷) 《C++编程思想》(第2卷)介绍C++实用的编程技术和最佳的实践方法,深入探究了...第6章 通用算法 第7章 通用容器 第三部分 专题 第8章 运行时类型识别 第9章 多重继承 第10章 设计模式 第11章 并发

    C++编程思想(Thinking in C++)完美版pdf

    Bruce Eckel 《Thinking in Java》(Java编程思想)作者。...第6章 通用算法 第7章 通用容器 第三部分 专题 第8章 运行时类型识别 第9章 多重继承 第10章 设计模式 第11章 并发 附录 附录A 推荐读物 附录B 其他 索引 

    MATLAB遗传算法工具箱使用手册

    本书可作为高等院校计算机、自动化、信息、管理、控制与系统工程等专业本科生或研究生的教材或...第六章 遗传算法工具箱的应用 第七章 遗传算法应用举例 第八章 使用MATLAB遗传算法工具 第九章 使用MATLAB直接搜索工具

    算法导论(part2)

    第6章 堆排序 6.1 堆 6.2 保持堆的性质 6.3 建堆 6.4 堆排序算法 6.5 优先级队列 第7章 快速排序 7.1 快速排序的描述 7.2 快速排序的性能 7.3 快速排序的随机化版本 7.4 快速排序分析 7.4.1 ...

    《MATLAB 遗传算法工具箱及应用·第二版》非扫描word转pdf完整版(极致清晰)

    第六章 遗传算法工具箱的应用 95 6.1 安装 95 6.2 种群的表示和初始化 95 6.3 目标函数和适应度函数 96 6.4 选择 97 6.5 交叉 99 6.6 变异 101 6.7 重插入 101 6.8 遗传算法的终止 102 6.9 数据结构 102 ...

    C++编程思想(第2版 第2卷)

     第6章 通用算法   第7章 通用容器   第三部分 专题  第8章 运行时类型识别   第9章 多重继承   第10章 设计模式   第11章 并发   附录  附录A 推荐读物   附录B 其他   索引

    算法导论(part1)

    第6章 堆排序 6.1 堆 6.2 保持堆的性质 6.3 建堆 6.4 堆排序算法 6.5 优先级队列 第7章 快速排序 7.1 快速排序的描述 7.2 快速排序的性能 7.3 快速排序的随机化版本 7.4 快速排序分析 7.4.1 ...

    第6讲 算法简介、顺序结构和选择结构.pptx

    本课程以计算机经典问题求解为导向,通用算法思维和自动编程流程图培养为目标,引入经典算法,精心安排课程的理论教学和编程实践。本课程学习将有助于学员提高计算思维能力及算法思维的能力。 本课程主要讲授计算机...

    地理信息系统算法基础.rar

    第6章空间度量算法 6.1直线和距离 6.1.1直线 6.1.2直线方程 6.1.3点到直线的距离 6.2角度量算 6.3多边形面积的量算 6.3.1三角形面积量算 6.3.2四边形面积量算 6.3.3任意二维平面多边形面积量算 ...

    程序员实用算法——源码

    第6章 树  6.1 二叉树  6.1.1 树查找  6.1.2 节点插入  6.1.3 节点删除  6.1.4 二叉查找树的性能  6.1.5 AVL树  6.2 红黑树  6.3 伸展树  6.4 B树  6.4.1 保持B树平衡  6.4.2 实现B树算法  ...

    分布式算法 作者:(美)Nancy A.Lynch 舒继武 李国东part1

    第6章 进程故障下的分布式一致性 56 6.1 问题 56 6.2 针对停止故障的算法 58 6.2.1 基本算法 58 6.2.2 减少通信 59 6.2.3 指数信息收集算法 61 6.2.4 带鉴别的byzantine一致性 66 6.3 针对byzantine故障的算法 66 ...

    《MATLAB计算机视觉与深度学习实战详例(代码合集1-30)完美版.zip

    第 1 章 基于直方图优化的图像去雾技术 第 2 章 基于 形态学的权重自适应图像去噪 第 3 章 基于多尺度形态学提取眼前节组织 第 4 章 基于 Hough 变化的答题卡识别 第 5 章 基于阈值分割的车牌定位识别 第 6 章 基于...

    算法心得:高效算法的奥秘(原书第2版).[美]Henry S.Warren,Jr(带详细书签).pdf

    第6章 在字组中搜索位串 106 6.1 寻找首个值为0的字节 106 6.1.1 0值字节位置函数的一些简单推广 110 6.1.2 搜索给定范围内的值 110 6.2 寻找首个给定长度的全1位串 111 6.3 寻找最长全1位串 114 6.4 寻找最短...

    MIT_Introduction to Algorithms 算法导论视频字幕

    9 第六课 序列统计,中位数 阅读:9 章 10 演示课 4 中位数的应用,桶式排序 阅读:8 章第 4 节 11 第七课 散列,通用散列 阅读: 11 章 1 到 3 节 收《作业 3》发《作业 4》 12 第八课 散列函数,完美散列 阅读...

    地理信息系统算法基础

    3.3仿射变换3.4地图投影变换3.4.1概述3.4.2地球椭球体的相关公式3.4.3兰勃特投影3.4.4墨卡托投影3.4.5高斯一克吕格投影3.4.6通用横轴墨卡托投影思考题第4章空间数据转换算法4.1矢量数据向栅格数据...

    数据结构与算法研究(强烈推荐)

    内容提要 第1章包含离散数学和递归的一些复习材料。我相信对递归做到泰然处之的惟一办法是反复不断地看一些好的用法。因此,除第5章外,递归...对来自第4章到第6章的三种数据结构以及本章介绍的斐波那契堆进行了分析。

    数学建模的29个通用模型及matlab解法.zip

    第六章 排队论 第七章 对策论 第八章 层次分析法 第九章 插值与拟合 第十章 数据的统计描述和分析 第十一章 方差分析 第十二章 回归分析 第十三章 微分方程建模 第十四章 稳定状态模型 第十五章 常微分方程的解法 ...

    第6讲 算法、数据结构简介及顺序结构和选择结构.pptx

    本课程以计算机经典问题求解为导向,通用算法思维和自动编程流程图培养为目标,引入经典算法,精心安排课程的理论教学和编程实践。本课程学习将有助于学员提高计算思维能力及算法思维的能力。 本课程主要讲授计算机...

Global site tag (gtag.js) - Google Analytics