C++升级之整洁之道(六)——函数式编程

  函数式编程也是一种编程范式,其定义通常归因于它的积极属性,包括:1.通过避免(全局)共享科不的状态消除了副作用,在纯函数式编程中,函数调用没有任何副作用。2.不可变的数据和对象。在纯函数编程中,所有数据都是不可变的,数据结构一旦创建,它就永远不会被改变,不可变数据具有线程安全的巨大优势。3.在函数式编程中,可以像对待数据一样对待函数,可以将函数存在在变量中,也可以将函数做评委参数传递给其他函数,还可以将函数作为其他函数的返回结果,函数可以很容易地链接。4.更好更容易的并行化,需要锁和同步机制来保护数据不被多个线程同时访问和操作。5.易于测试
  如式 y = f ( x ) y=f(x) y=f(x)所示:函数f将x的任何可能的指隐射为y的唯一一个值,在数学和计算机编程中,这也称为引用透明。在单线程环境在,全局状态可能很少会导致一些问题,在多线程环境中,全局状态或对象的实例状态通常很容易出问题,并且可能导致不可预测的行为或细微的错误。
  模板元编程是一种技术,其中编程器使用所谓的模板生成C++源代码,然后再将源代码转换为目标代码。如果使用大量的模板元编程,代码的可读性和可理解性会受到严重影响。
  在C++中一直可以定义和使用所谓的像函数一样的对象,它们也被称为仿函数。从技术上讲,仿函数基本上只有一个定义了括号运算符的类,即定义了operator()的类。实例化这些类之后,它们就可以像函数一样使用。
  头文件 < n u m e r i c > <numeric> <numeric>已经包含了一个函数模板std::iota(),以编程语言APL的函数符号Iota明明,它不是生成器仿函数,但它可以用来填充容器,并以一直优雅的方式递增序列的值。
  函数模板std::bind是函数及其参的一个绑定包装器,你可以讲实际值绑定到函数的一个或所有参数上,可以用现有的函数或仿函数创建新的函数对象。
  随着C++11的出现,该语言扩招了一个新的值得注意的功能:lambda表达式!关于lamdba表达式,其他经常使用的属于还有lambada函数、函数字面量,有时候它们也被称为闭包,这种叫法也不完全正确。lambda表达式的特殊之处在于它们通常是内敛实现的,记载应用时实现的。这有时可以提高代码的可读性,编译器可以更有效地应用器优化策略,当然,lambda函数也可以被视为数据。
[ c a p t u r e l i s t ] ( p a r a m e t e r l i s t ) − > r e t u r n t y p e d e c l a r a t i o n l a m b d a b o d y [capture list](parameter list)->return_type_declaration{lambda body} [capturelist](parameterlist)>returntypedeclarationlambdabody
  函数式编程地核心概念就是所谓的高阶函数,是讲一个或多个其他函数作为参数的函数,或者它们可以返回函数作为结果。在C++中,任何可调用对象,例如std::function包装的实例、函数指针、从lambda表达式创建的闭包、手动编写的仿函数以及其他任何实现了operator()的东西都可以作为参数传递给高阶函数。
  每种沿着的函数式编程都必须提供至少有用的高阶函数:Map、Filter和Reduce(同义词:fold),即使又是根据编程语言的不同它们会有不同的名称,都可以在具有函数式编程功能的许多其他语言中找到这三个函数,这三个高阶函数构成了一个非常常见的函数式编程设计模式。
  从C++17开始,该语言获得了一个有趣的新功能,称为fold表达式。C++17中的Fold表达式被实现可变参数模板,级可以以类型安全的方式获取任意数量的参数的模板,这些任意梳理的参数保存至所谓的参数包中。
  使用函数式编程风格可以更好地解决复制1数学计算,如果必须满足较高的性能和效率要求,浙江不可避免地要求某些任务之间的并行化,函数式编程可以发挥其至关重要的作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值