☰
C++学习日记 Day17:STL-函数对象+内建函数对象+常用算法
2026/10/10 10:38:58 网站建设 项目流程

## 今天学了什么

今天学习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已弃用

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询