C++ STL 函数对象 内建函数对象-算术仿函数 关系仿函数 逻辑仿函数

文章介绍了STL中的内建函数对象,包括算术仿函数(如加、减、乘、除)、关系仿函数(如等于、不等于、大于、小于)和逻辑仿函数(如逻辑与、或、非)。通过示例代码展示了这些仿函数的使用方法,如在排序和逻辑运算中的应用,强调了它们提高代码复用率的作用,并指出使用时需要引入<functional>头文件。

内建函数对象

1 内建函数对象意义

概念: STL内建了一些函数对象,已经提供了一些仿函数,提高代码复用率

分类:

  • 算术仿函数 算术上的加、减、乘、除等

  • 关系仿函数 关系上的相等、不等、大于、小于等

  • 逻辑仿函数 逻辑上的与、或、非等

用法:

  • 这些仿函数所产生的对象,用法和一般函数完全相同
  • 使用内建函数对象,需要引入头文件 #include<functional>

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> //取反仿函数

可以看到,以上函数的原型大致相同,只是具体实现的功能不一样。以下以加法和取反为例展示

代码示例:

//一元仿函数 negate 取反仿函数
void test1()
{
	cout << "一元仿函数" << endl << endl;
	cout << "取反仿函数\tnegate" << endl;

	negate<int> n;

	cout << "取反前 num = 25\n取反后 num = " << n(25) << endl;

	cout << string(30, '-') << endl;
}

//plus 二元仿函数 plus minus multiplies divides modulus
void test2()
{
	int len = 30;
	cout << "\n二元仿函数" << endl << endl;

	cout << "加法仿函数\tplus" << endl;
	plus<int> p1;//默认都是对同一类型相加 只需要传一种类型即可
	cout << "30 + 15 = " << p1(30, 15) << endl;
	cout << string(len, '-') << endl;

	cout << "减法仿函数\tminus" << endl;
	minus<int> p2;
	cout << "30 - 15 = " << p2(30, 15) << endl;
	cout << string(len, '-') << endl;

	cout << "乘法仿函数\tmultiplies" << endl;
	multiplies<int> p3;
	cout << "30 × 15 = " << p3(30, 15) << endl;
	cout << string(len, '-') << endl;

	cout << "除法仿函数\tdivides" << endl;
	divides<int> p4;
	cout << "30 ÷ 15 = " << p4(30, 15) << endl;
	cout << string(len, '-') << endl;

	cout << "取模仿函数\tmodulus" << endl;
	divides<int> p5;
	cout << "30 % 15 = " << p5(30, 15) << endl;
	cout << string(len, '-') << endl;
}

在这里插入图片描述

总结: 使用内建函数对象时,需要引入头文件 #include <functional>

3 关系仿函数

功能描述: 实现关系对比

仿函数原型:

  • 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> //小于等于

代码示例:

void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
}

class MyGreater
{
public:
	bool operator()(int v1, int v2)
	{
		return v1 > v2;
	}
};

//大于 greater
void test1()
{
	int len = 60;
	cout << "vector容器 无序插入" << endl;
	cout << "v:";
	vector<int> v;
	v.push_back(30);
	v.push_back(18);
	v.push_back(23);
	v.push_back(25);
	v.push_back(26);
	v.push_back(21);
	printVector(v);
	cout << string(len, '-') << endl;
	
	//降序 自己写谓词
	cout << "\nvector容器 降序插入 sort算法 自己写谓词" << endl;
	cout << "v:";
	vector<int> v2;
	v2.push_back(30);
	v2.push_back(18);
	v2.push_back(23);
	v2.push_back(25);
	v2.push_back(26);
	v2.push_back(21);
	sort(v2.begin(), v2.end(), MyGreater());//自己写谓词
	printVector(v2);
	cout << string(len, '-') << endl;

	//降序 greater关系仿函数
	cout << "\nvector容器 降序插入 sort算法 greater关系仿函数" << endl;
	cout << "v:";
	vector<int> v3;
	v3.push_back(30);
	v3.push_back(18);
	v3.push_back(23);
	v3.push_back(25);
	v3.push_back(26);
	v3.push_back(21);
	sort(v3.begin(), v3.end(), greater<int>());
	printVector(v3);
	cout << string(len, '-') << endl;
}

在这里插入图片描述
可以看到sort源码也使用了内建函数对象 less 小于,所以sort默认是升序排序规则
在这里插入图片描述

总结: 关系仿函数中最常用的就是greater<>大于

4 逻辑仿函数

功能描述: 实现逻辑运算

函数原型:

  • template<class T> bool logical_and<T> //逻辑与
  • template<class T> bool logical_or<T> //逻辑或
  • template<class T> bool logical_not<T> //逻辑非

代码示例:

void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << "  ";
	}
	cout << endl;
}


void test1()
{
	int len = 20;
	cout << "v1:";
	vector<int> v;
	v.push_back(1);
	v.push_back(0);
	v.push_back(1);
	v.push_back(0);
	v.push_back(1);
	v.push_back(0);
	printVector(v);
	cout << string(len, '-') << endl;

	//利用逻辑非 v搬运到v2中 并实现取反
	vector<int> v2;
	
	//v2预留v的空间大小
	v2.resize(v.size());

	//transform搬运算法
	transform(v.begin(), v.end(), v2.begin(), logical_not<bool>());

	cout << "\nv2:";
	printVector(v2);
	cout << string(len, '-') << endl;

在这里插入图片描述
注意:

  • transform是搬运算法,第一个参数是源容器起始迭代器,第二个参数是源容器接受迭代器,第三个是目的容器起始迭代器,最后是仿函数。仿函数功能是加减乘除、与或非都可以。
  • transform搬运前,目的容器需要开辟空间,否则无法搬运

总结: 逻辑仿函数实际应用较少,了解即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值