C11新特性

function 函数对象

STL全析——四.函数对象

为什么使用function类:

绑定器,函数对象, lambda表达式它们只能使用在一条语句中,如何实现复用,把他们的类型留下,这就是function类型的作用

注意点:

  • 1.实例化function类型的时候必须用一个函数类型
  • 2.通过function调用operator ( )函数的时候,需要根据函数类型传入相应的参数
  • 3.使用类的成员方法的时候必须依赖一个对象,所以使用类的成员方法时第一个参数是this指针,因此传入的参数第一个是一个临时对象的地址

看似函数对象干的事情函数指针都可以做,但是函数对象可以保存lambda表达式,绑定器绑定的函数对象,函数指针就办不到。

1.使用普通的全局函数

C11新特性_第1张图片
在这里插入图片描述

2.使用类的成员方法

C11新特性_第2张图片

bind 绑定器

C++STL绑定器

在这里插入图片描述
在这里插入图片描述
C11新特性_第3张图片

C++11绑定器

绑定器最多绑定20个参数
在这里插入图片描述
C++STL里面的bind1st和bind2nd只能用于二元函数对象,C++11提供的绑定器功能更加强大。

bind用法1:

C11新特性_第4张图片

bind用法2:参数占位符

在这里插入图片描述

bind和function综合使用

function只能接收一个类型,而绑定器可以给函数绑定参数。绑定器只能使用在语句当中,语句完了绑定器就需要重新书写,那么如何把绑定器的类型留下来呢?就需要综合使用bind和function

C11新特性_第5张图片

lambda表达式

在这里插入图片描述
lambda表达式可以看作是函数对象的升级版

函数对象的缺点:

仅仅可以使用在泛型算法参数传递的过程中,在具有比较性质或自定义操作的优先级队列里面,自定义类型作为优先级队列里面的元素,而元素的比较方式就需要给它传递一个函数对象,传递函数对象最大的特点就是需要先定义一个类型,这个类型定义以后就只会使用在优先级队列里面,优先级队列使用完后其他地方就再也用不到了。因此就没有必要需要一个函数对象还得定义一个类型出来,灵活性太差

C11新特性_第6张图片
C11新特性_第7张图片

lambda表达式的使用

C11新特性_第8张图片

C11新特性_第9张图片
C11新特性_第10张图片
C11新特性_第11张图片

function类型和lambda表达式的应用

C11新特性_第12张图片

lambda表达式自定义智能指针删除器

在这里插入图片描述

优先级队列自定义比较器

C11新特性_第13张图片
C11新特性_第14张图片

智能指针

C++智能指针

解决浅拷贝问题

C11新特性_第15张图片

不带引用计数的智能指针auto_ptr,scoped_ptr,unique_ptr

  • auto_ptr:转移资源控制权,只有最后一次引用的智能指针才拥有资源,之前的全部失效,被 C++11 摒弃。
  • scoped_ptr:直接禁止了拷贝构造和赋值,每个对象对资源都是独占的。
  • unique_ptr:直接禁止了拷贝构造和赋值,但是提供了带右值引用参数版本的拷贝构造和赋值,即可以使用移动拷贝和移动构造。

带引用计数的智能指针shared ptr、weak_ptr

C11新特性_第16张图片

  • shared_ptr:提出了引用计数的概念,可使得多个智能指针共享同一资源,只有当引用计数为 0 时,才去释放资源。
  • weak_ptr:它的提出主要是辅助 shared_ptr,它本身不拥有资源,但是可以监视资源,防止 shared_ptr 的交叉引用问题。

shared_ptr和weak_ptr都是线程安全的,都可以使用在多线程环境下

智能指针的交叉引用(循环引用)问题

在这里插入图片描述

多线程访问共享对象问题

多线程访问共享对象的安全问题就可以使用到强弱智能指针,因为shared_ptr可以在线程中检测资源的引用计数来侦测资源是否存活。

自定义删除器

为什么需要给智能指针定义删除器?
因为智能指针的作用是能够保证资源绝对的释放,而智能指针默认的释放方式是delete ptr.而当智能指针托管的资源是数组时,释放资源时就需要加[ ] ,当智能指针管理的不是一块内存的资源,而是一个文件,释放文件的方式绝对不是通过delete来实现的,因此通过智能指针管理资源需要能够释放相应的资源,如何给智能指针自定义删除器来指导智能指针正确的释放资源,这就是删除器的作用。
C11新特性_第17张图片

C11新特性_第18张图片

你可能感兴趣的:(C++进阶,c++)