13 STL-函数对象
重新系统学习c++语言,并将学习过程中的知识在这里抄录、总结、沉淀。同时希望对刷到的朋友有所帮助,一起加油哦!
每一次学习都是为了追求智慧!
写在前面,本篇章主要介绍STL中常用容器函数对象。
1.1 函数对象
1.1.1 函数对象概念
概念:
重载函数调用操作符的类,称为函数对象。
函数对象使用重载的()时,行为类似函数调用,也叫仿函数。
本质:
函数对象(仿函数)是一个类,不是一个函数。
1.1.2 函数对象使用
特点:
1 函数对象在使用时,可以像普通函数一样调用,可以有参数,有返回值;
2 函数对象超出普通函数概念,可以有自己的状态,定义一些内部成员属性;
3 函数对象可以作为参数传递。
示例:
1.2 谓词
1.2.1 概念
概念:
谓词:防函数,返回bool类型。
一元谓词:一个参数的谓词
二元谓词:两个参数的谓词
1.2.2 一元谓词
使用vector<int>::iterator pos = find_if(v.begin(), v.end(), GreaterFive());来体会一元谓词的使用。
示例:
1.2.3 二元谓词
// 利用仿函数MyCompare()改变排序规则 大到小
sort(v.begin(), v.end(), MyCompare());
示例:
1.3 内建函数对象
1.3.1 内建函数意义
概念:
STL内部提供了一些通用函数对象
分类:
算术仿函数
关系仿函数
逻辑仿函数
用法:
和普通函数完全相同
需要引入头文件 #include<functional>
1.3.2 算术仿函数
能力:
实现四则运算
negate 是一元运算,其他都是二元运算。
仿函数原型:
- template<class T> T plus<T> //加法仿函数
- template<class T> T minus<T> //减法仿函数
- template<class T> T multiplies<T> //乘法仿函数
- template<class T> T divides<T> //除法仿函数
- template<class T> T modulus<T> //取模仿函数
- template<class T> T negate<T> //取反仿函数
示例:
1.3.3 关系仿函数
能力:
实现关系对比。
algotithm 算法库里,sort函数是默认的升序,使用的就是less<T> 。
仿函数原型:
- template<class T> bool equal_to<T> //等于
- template<class T> bool not_equal_to<T> //不等于
- template<class T> bool greater<T> //大于
- template<class T> bool greater_equal<T> //大于等于
- template<class T> bool less<T> //小于
- template<class T> bool less_equal<T> //小于等于
示例:
输出:
10 30 50 20 40
10 20 30 40 50
50 40 30 20 10
------------v2
10 30 50 20 40
1.3.4 逻辑仿函数
能力:
实现逻辑运算。
仿函数原型:
template<class T> bool logical_and<T>
//逻辑与template<class T> bool logical_or<T>
//逻辑或template<class T> bool logical_not<T>
//逻辑非
示例: