STL学习3常用算法3.1函数对象

一、函数对象

1、函数对象就是重载了()的类,又叫函数符、仿函数,调用类似于普通函数,可以作为函数参数传递

2、

2、测试程序

#include"pch.h"
#include<iostream>
using namespace std;

//1、函数对象是重载了()的类,调用方式类似普通函数  仿函数
class MyPrint
{
public: 
	int m_count=0;
	void operator()(int num)
	{
		cout << num << endl;
		m_count++;
	}
};

void myprint(int num)
{
	cout << num << endl;
}

void test01()
{
	//MyPrint(100);要先创建函数对象类,再调用
	MyPrint m;
	m(100);//调用函数对象
	myprint(100);
}

//2、函数对象 超出普通函数的概念  内部可以拥有自己的状态

void test02()
{
	MyPrint m;
	m(100);
	m(100);
	m(100);
	m(100);
	cout << "总共打印的次数:" << m.m_count << endl;
}

//函数对象可以作为函数的参数
void doWork(MyPrint mp,int num)
{
	mp(num);//调用重载的()函数,打印num
}
void test03()
{
	doWork(MyPrint(), 1000);//匿名的函数对象作为参数
}
int main()
{
	//test01();
	//test02();
	test03();
}

二、谓词

1、指普通函数或重载的operator()返回值是bool类型的函数对象

2、若operator接收一个参数就叫一元谓词,接收两个就叫二元谓词

3、谓词可作为一个判断式

4、案例测试

#include"pch.h"
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

//谓词 普通函数 或函数符 返回值是bool类型
//一元谓词

class GreaterThen20
{
public:
	bool operator()(int val)
	{
		return val > 20;
	}
};
void test01()
{
	vector<int>v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);

	//找到第一个大于20的数字
	vector<int>::iterator it;
	it=find_if(v.begin(), v.end(), GreaterThen20());
	if (it != v.end())
	{
		cout << *it << endl;
	}
	else
	{
		cout << "fail." << endl;
	}
}

//二元谓词
class MyCompare
{
public:
	bool operator()(int v1, int v2)
	{
		return v1 > v2;
	}
};

void test02()
{
	vector<int>v;
	v.push_back(10);
	v.push_back(30);
	v.push_back(20);
	v.push_back(40);

	//从大到小排序
	sort(v.begin(), v.end(), MyCompare());//第三个参数如果是仿函数要放函数对象
	//如果是回调函数放函数名即可不加()

	// []() {} 匿名函数 lambda表达式 声明+参数+表达式
	for_each(v.begin(), v.end(), [](int val) {cout << val << endl; });

}
int main()
{
	//test01();
	test02();
}

三、内建函数对象

1、由头文件functional包含的自带的函数对象

2、算数类函数对象除negate外其他都是二元运算,返回值为T类型数据

   2.1 加法 plus、减法 minus、乘法 multiplies、除法 divides、 取模modulus、取反negate

3、关系运算类,每种都是二元运算,返回值为bool类型

    3.1 等于 equal_to、不等于not_equal_to、大于 greater、 大于等于greater_equal、小于 less、小于等于less_equal

4、逻辑运算类  not为一元  其他都是二元 返回值为bool

    4.1  逻辑与 logical_and、逻辑或logical_or、逻辑非logical_not

5、测试程序

#include"pch.h"
#include<iostream>
#include<functional>
#include<vector>
#include<algorithm>
using namespace std;

//template<clss T>T negate<T>//取反仿函数
void test01()
{
	negate<int>n;
	cout << n(10) << endl;//输出-10
}

//template<clss T>T plus<T>//加法仿函数
void test02()
{
	plus<int>n;
	cout << n(10,10) << endl;//输出20
}

//template<clss T>bool greater<T>//大于仿函数
void test03()
{
	greater<int>n;
	cout << n(10, 10) << endl;//输出0
	vector<int>v;
	v.push_back(10);
	v.push_back(30);
	v.push_back(50);
	v.push_back(70);
	v.push_back(60);
	sort(v.begin(), v.end(), greater<int>());
	for_each(v.begin(), v.end(), [](int val) {cout << val << endl; });
}
int main()
{
	//test01();
	//test02();
	test03();
}

   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值