C++系列-内建函数对象


十五夜望月
唐 王建
中庭地白树栖鸦,冷露无声湿桂花。
今夜月明人尽望,不知秋思落谁家?


💢什么是内建函数对象

  • 🔥内建函数对象,也称为预定义函数对象,标准库函数对象。
  • 🔥内建函数对象,在<functional>头文件中定义的一组可用于各种算法和容器操作的对象。
  • 🔥内建函数对象主要有算术函数对象,关系函数对象,逻辑函数对象。

💢算术函数对象

算术函数对象描述
plus加法函数对象
minus减法函数对象
multiplies乘法函数对象
divides除法函数对象
modulus取模函数对象
negate取反函数对象

👉 👉 👉
其中negate是一元运算的,其余都是二元运算。
注意在下面代码中transform的参数: const _InIt1 _First1, const _InIt1 _Last1, const _InIt2 _First2, _OutIt _Dest, _Fn _Func) ,前几个传递的都是迭代器。

code:
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;

void print_vector(vector<int>& vec)
{
	for (auto i_vec : vec)
	{
		cout << i_vec << " ";
	}
	cout << endl;
}

void test01()
{
	// negate举例
	negate<int>n1;
	cout << "negate, n1(5): " << n1(5) << endl;
	cout << "negate, n1(-5): " << n1(-5) << endl;
}

void test02()
{
	// 其它举例
	vector<int> vec1{11, 22, 33, 44};
	cout << "vec1: " << endl;
	print_vector(vec1);
	vector<int> vec2{1, 2, 3, 10};
	cout << "vec2: " << endl;
	print_vector(vec2);
	vector<int> result(vec1.size()); // 创建vec1.size()个元素,并将其初始化为0
	// transform的参数: const _InIt1 _First1, const _InIt1 _Last1, const _InIt2 _First2, _OutIt _Dest, _Fn _Func) 
	transform(vec1.begin(), vec1.end(), vec2.begin(), result.begin(), plus<int>());
	cout << "plus, result:" << endl;
	print_vector(result);

	transform(vec1.begin(), vec1.end(), vec2.begin(), result.begin(), minus<int>());
	cout << "minus, result:" << endl;
	print_vector(result);

	transform(vec1.begin(), vec1.end(), vec2.begin(), result.begin(), multiplies<int>());
	cout << "multiplies, result:" << endl;
	print_vector(result);

	transform(vec1.begin(), vec1.end(), vec2.begin(), result.begin(), divides<int>());
	cout << "divides, result:" << endl;
	print_vector(result);

	transform(vec1.begin(), vec1.end(), vec2.begin(), result.begin(), modulus<int>());
	cout << "modulus, result:" << endl;
	print_vector(result);
}

int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}

result:
negate, n1(5): -5
negate, n1(-5): 5
vec1:
11 22 33 44
vec2:
1 2 3 10
plus, result:
12 24 36 54
minus, result:
10 20 30 34
multiplies, result:
11 44 99 440
divides, result:
11 11 11 4
modulus, result:
0 0 0 4

💢关系函数对象

关系函数对象描述
equal_to判断两个值是否相等,例如查找容器中是否存在特定值
not_equal_to不等于函数对象
greater大于函数对象
greater_equal大于等于函数对象
less小于函数对象
less_equal小于等于函数对象

👉 👉 👉
下面代码中用到any_of, any_of() 在给定的范围内迭代,并为每个元素给定的回调,即一元谓词。如果某一个元素,使得谓词的返回值我true,则停止进一步迭代并返回 true,否则返回 false。
bind1st()和bind2nd()都是把二元函数转化为一元函数,方法是绑定其中一个参数,本类中绑定第二个参数(3,想让vectror中的元素和3比)。

code:
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;

void print_vector(vector<int>& vec)
{
	for (auto i_vec : vec)
	{
		cout << i_vec << " ";
	}
	cout << endl;
}

void test01()
{
	// equal_to
	vector<int> vec1 = { 1,2,3,4,5 };
	// any_of(const _InIt _First, const _InIt _Last, _Pr _Pred)
	// equal_to: bool operator()(const _Ty& _Left, const _Ty& _Right)
	print_vector(vec1);
	bool found0 = any_of(vec1.begin(), vec1.end(), bind2nd(equal_to<int>(), 1));
	cout << "equal_to: " << found0 << endl;

	// not_equal_to
	vector<int> vec2(5, 3);
	print_vector(vec2);
	bool found1 = any_of(vec2.begin(), vec2.end(), bind2nd(not_equal_to<int>(), 3));
	cout << "not_equal_to: " << found1 << endl;

	// greater, 降序排序
	vector<int> vec3{10, 20, 100, 40, 30};
	print_vector(vec3);
	sort(vec3.begin(), vec3.end(), greater<int>());
	cout << "greater: " << endl;
	print_vector(vec3);

	// less, 升序排序
	sort(vec3.begin(), vec3.end(), less<int>());
	cout << "less: " << endl;
	print_vector(vec3);
}

int main()
{
	test01();
	system("pause");
	return 0;
}

result:
1 2 3 4 5
equal_to: 1
3 3 3 3 3
not_equal_to: 0
10 20 100 40 30
greater:
100 40 30 20 10
less:
10 20 30 40 100

💢逻辑函数对象

关系函数对象描述
logical_and判断两个值是否相等,例如查找容器中是否存在特定值
logical_or不等于函数对象
logical_not大于函数对象

👉 👉 👉
下面代码中,bind2nd(logical_and(), 1)表示与1做逻辑与操作。

code:
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;

void print_vector(vector<int>& vec)
{
	for (auto i_vec : vec)
	{
		cout << i_vec << " ";
	}
	cout << endl;
}

void test01()
{
	// logical_and
	vector<int> vec1 = { 0,2,3,0,5 };
	cout << "---------- vec1 ----------" << endl;
	print_vector(vec1);
	vector<int> vec2(vec1.size());
	// bind2nd(logical_and<int>(), 1)实现与1的逻辑与操作
	transform(vec1.begin(), vec1.end(), vec2.begin(), bind2nd(logical_and<int>(), 1));
	cout << "---------- logical_and 1, vec2 ----------" << endl;
	print_vector(vec2);

	transform(vec1.begin(), vec1.end(), vec2.begin(), bind2nd(logical_or<int>(), 1));
	cout << "---------- logical_or1, vec2 ----------" << endl;
	print_vector(vec2);

	transform(vec1.begin(), vec1.end(), vec2.begin(), logical_not<int>());
	cout << "---------- logical_not, vec2 ----------" << endl;
	print_vector(vec2);
}

int main()
{
	test01();
	system("pause");
	return 0;
}

result:
---------- vec1 ----------
0 2 3 0 5
---------- logical_and 1, vec2 ----------
0 1 1 0 1
---------- logical_or1, vec2 ----------
1 1 1 1 1
---------- logical_not, vec2 ----------
1 0 0 1 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值