判别式(predicate):
返回为bool类型(或者可以隐式转换成bool类型)的函数。在STL中,判别式有着广泛的用途。标准关联容器的比较函数就是判别式:对于像find_if以及各种与排序有关的算法,判别式往往也被作为参数来传递。

纯函数(pure function):
返回值仅仅以依赖于其参数的函数。例如,假设f是一个纯函数,x和y是两个对象,那么只有当x或者y的值发生变化的时候,f(x, y)的返回值才可能发生变化。

在C++中,纯函数所能访问的数据应该仅限于参数以及常量,如果一个纯函数需要访问那些可能会在两次调用之前发生变化的数据,那么用相同的参数在不同的时刻调用该函数就有可能会得到不同额结果,这将与纯函数的定义像矛盾。

判别式类(predicate class):
是一个函数子类,它的operator()函数是一个判别式,也就是说,它的operator()返回true或者false。STL中凡是能接受判别式的地方,也可以接受一个判别式类对象。

对于用作判别式的函数对象,使用时它会被拷贝存起来,然后再使用这个拷贝。这一特性要求判别式函数必须是纯函数。

以一个反例来阐述判别式不是纯函数的后果:

class BadPredicate // 判别式类(带状态)
{public:BadPredicate() : timesCalled(0) { }bool operator () (const Widget&) { return ++timesCalled == 3; }
private:int timesCalled;
}

使用BadPredicate删除vector中的第三个Widget:

std::vector<Widget> datas;
...
datas.erase(std::remove_if(datas.begin(), datas.end(), BadPredicate()), datas.end());

这段代码看起来合理,其是它不只会删除datas中容器的第三v个元素,还是删除第六个。

你需要了解remove_if的实现:

template<typename FwdIterator, typename Predicate>
FwdIterator remove_if(FwdIterator begin, FwdIterator end, Predicate p)
{begin = find_if(begin, end, p);if (begin == end) return begin;else{FwdIterator next = begin;return remove_copy_if(++next, end, begin, p);}
}

调用remove_if,p先被传递给find_if,然后又被传递给remove_copy_if,由于是拷贝传递,每次传入的Prdicate对象中timesCalled都是0,因此位置3和位置6的元素最终都会被删除。

STL中凡是需要判别式的地方,既可以接受一个真正的函数,也可以接受一个判别式的对象。反之依然,STL总凡是可以接受一个真正的函数,也可以接受一个判别式函数。

39. 确保判别式是纯函数相关推荐

  1. java 函数式编程 示例_功能Java示例 第8部分–更多纯函数

    java 函数式编程 示例 这是第8部分,该系列的最后一部分称为"示例功能Java". 我在本系列的每个部分中开发的示例是某种"提要处理程序",用于处理文档. ...

  2. 功能Java示例 第8部分–更多纯函数

    这是第8部分,该系列的最后一部分称为" Functional Java by Example". 我在本系列的每个部分中发展的示例是某种"提要处理程序",用于处 ...

  3. 纯函数是什么?怎么合理运用纯函数?

    前言 纯函数这个这个词我相信小伙伴们多多少少都听说过,它是函数式编程的基础.本文主要是对纯函数进行探讨,包括基本概念,优点,运用的经典案例以及我们日常该如何去合理的使用等等. 纯函数的概念 首先我们来 ...

  4. react中纯函数_如何在纯React中创建电子邮件芯片

    react中纯函数 by Andreas Remdt 由Andreas Remdt 如何在纯React中创建电子邮件芯片 (How to create email chips in pure Reac ...

  5. GRDB自定义的纯函数

    GRDB自定义的纯函数 在GRDB中,用户可以自定义SQlite函数.这样,在SQL语句中,可以直接调用这些函数.但是在定义的时候,用户需要指定函数的pure属性,表示该函数是否为纯函数.纯函数是编程 ...

  6. JavaScript函数式编程之深入理解纯函数

    更多相关内容见博客 https://github.com/zhuanyongxigua/blog 纯函数是函数式编程的基础,需要重点理解. 纯函数的概念: 纯函数是这样一种函数,即相同的输入,永远会得 ...

  7. [react] 请描述你对纯函数的理解?

    [react] 请描述你对纯函数的理解? 给定了输入的参数,则函数抛出的数据就是确定的 函数内没有副作用(定时器,ajax等) 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一 ...

  8. [js] 纯函数和函数式编程有什么关系?

    [js] 纯函数和函数式编程有什么关系? 函数式编程是一种编程思想,纯函数是这种思想的基本要实现函数式编程,我们所封装的方法应该是抽象的,应该是和外部状态无关系的,也就需要是纯函数的,这样才能保证抽象 ...

  9. JS高级——纯函数、柯里化(手写自动柯里化函数)、组合函数(手写自动组合函数)

    一.理解JavaScript纯函数 函数式编程中有一个非常重要的概念叫纯函数,JavaScript符合函数式编程的范式,所以也有纯函数的概念: 在react开发中纯函数是被多次提及的: 比如react ...

  10. [转载] 纯函数和函数柯里化

    参考链接: 用示例编写Java柯里化Currying函数 文章目录 纯函数什么是纯函数纯函数例子非纯函数例子 函数柯里化函数柯里化简单例子参数复用 纯函数 什么是纯函数 如果函数的调用参数相同,则永远 ...

最新文章

  1. 听得我都激动了……喝死奥巴马,你怎么看?
  2. flyway版本号_数据库版本管理工具-flyway
  3. uniapp怎么引入css_CSS 三种基础选择器
  4. (计算机组成原理)第二章数据的表示和运算-第二节3:定点数的移位运算(算数移位、逻辑移位和循环移位)
  5. 面试官系统精讲Java源码及大厂真题 - 01 开篇词:为什么学习本专栏
  6. jmeter远程启动命令_Jmeter命令行方式启动
  7. python xlrd模块
  8. 使用 Task 简化异步编程
  9. python colormap_Python科学计算技巧积累八——colormap 和 contour map的绘制
  10. 中国酸2-葡萄糖苷(AA2G)市场趋势报告、技术动态创新及市场预测
  11. 函数名、闭包及迭代器
  12. 视频教程-思科入门CCNA初级网络工程师视频课程-网络技术
  13. BubbleSort C#
  14. 详析:谷歌为何紧急封杀阿里云OS?
  15. java递归走迷宫游戏
  16. 淘宝大数据,打假新武器
  17. Tableau数据分析-Chapter04标靶图、甘特图、瀑布图
  18. 直播间搭建实现iOS直播聊天消息界面
  19. 怎么开发支付宝扫码收款应用-java 支付宝当面付
  20. 程序员技术面试与HR谈薪资技巧的一些经验心得

热门文章

  1. javascript基础修炼(8)——指向FP世界的箭头函数
  2. 前端每日实战:121# 视频演示如何用 CSS 和 D3 创作一个小鱼游动的交互动画
  3. nrm —— 快速切换 NPM 源
  4. activity 的返回按钮
  5. grep 二进制文件grep AMI 2012-11-23.log Binary file 2012-11-23.log matches
  6. rman异机恢复数据库
  7. 17.企业应用架构模式 --- 会话状态模式
  8. 6.数据结构 --- 树和二叉树
  9. 14.Linux/Unix 系统编程手册(上) -- 文件系统
  10. 18. PHP 表单验证