内建函数对象
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搬运前,目的容器需要开辟空间,否则无法搬运
总结: 逻辑仿函数实际应用较少,了解即可
文章介绍了STL中的内建函数对象,包括算术仿函数(如加、减、乘、除)、关系仿函数(如等于、不等于、大于、小于)和逻辑仿函数(如逻辑与、或、非)。通过示例代码展示了这些仿函数的使用方法,如在排序和逻辑运算中的应用,强调了它们提高代码复用率的作用,并指出使用时需要引入<functional>头文件。

300

被折叠的 条评论
为什么被折叠?



