## 今天学了什么
今天学习C++中STL-函数对象、内建函数对象以及STL的一些常用算法。
## 函数对象
定义:
- 重载函数调用操作符的类,其对象成为函数对象;
- 函数对象使用重载的()时,行为类似函数调用,也叫做仿函数。
本质:函数对象是一个类,不是函数。
函数对象的使用:
- 在使用时可以向普通函数那样调用,可以有参数,可以有返回值;
- 可以有自己的状态;
- 函数对象可以作为参数传递;
## 谓词
定义:
- 返回值是bool类型的仿函数。
- 如果operator()接收一个参数,称为一元谓词,两个参数称为二元谓词;
## 内建函数对象
STL内建了一些函数对象,分为算术仿函数、关系仿函数、逻辑仿函数;
头文件#include<functional>
### 算术仿函数
- template<class T> negate<T> 取反仿函数
- template<class T> plus<T> 加仿函数
- template<class T> minus<T> 减仿函数
- template<class T> multiplies<T> 乘仿函数
- template<class T> divides<T> 除仿函数
- template<class T> modulus<T> 取模仿函数
用法示例:
negate<int>n;
n(50) ;
### 关系仿函数
- 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> 小于等于仿函数
### 逻辑仿函数
- template<class T> bool logical_and<T> 逻辑与仿函数
- template<class T> bool logical_or<T> 逻辑或与仿函数
- template<class T> bool logical_not<T> 逻辑非与仿函数
## STL常用算法
主要头文件 : algorithm、functional、numeric等。
①常用遍历算法
- for_each(v.begin(), v.end(),val);
- transform(v.begin(), v.end(), v2.begin(), _func); //搬运
* 注:使用transform需要先指定v2容器的大小;
搬运时复制,不是剪切。
②常用查找算法
- vector<int>::iterator it=find(v.begin(), v.end(), val); //返回迭代器
- vector<int>::iterator it =find_if(v.begin(), v.end(), _pred); //返回迭代器
- vector<int>::iterator it=adjacent_find(v.begin(), v.end()); // 查找相邻重复元素 返回迭代器
- bool ret=binary_search(v.begin(), v.end(), val); // 二分查找 返回bool值
- int num =count(v.begin(), v.end(), val);
- int num =count_if(p.begin(), p.end(), _pred);
* 注:自定义类使用以上算法时,需重载operator==;
二分查找必须有序,无序结果未知。
③常用排序算法
- sort(v.begin(), v.end(), _pred)
- merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vt.begin()); //合并两个有序容器,并存到另一个容器中,合并后容器仍有序
- reverse(v.begin(), v.end()); //反转
- random_shuffle(v.begin(), v.end()); //打乱顺序 C++14已弃用