概念: STL内建了一些函数对象,已经提供了一些仿函数,提高代码复用率
分类:
算术仿函数 算术上的加、减、乘、除等
关系仿函数 关系上的相等、不等、大于、小于等
逻辑仿函数 逻辑上的与、或、非等
用法:
#include
功能描述:
仿函数原型:
template T plus
//加法仿函数template T minus
//减法仿函数template T multiplies
//乘法仿函数template T divides
//除法仿函数template T modulus
//取模仿函数template T negate
//取反仿函数可以看到,以上函数的原型大致相同,只是具体实现的功能不一样。以下以加法和取反为例展示
代码示例:
//一元仿函数 negate 取反仿函数
void test1()
{cout << "一元仿函数" << endl << endl;cout << "取反仿函数\tnegate" << endl;negate 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 p1;//默认都是对同一类型相加 只需要传一种类型即可cout << "30 + 15 = " << p1(30, 15) << endl;cout << string(len, '-') << endl;cout << "减法仿函数\tminus" << endl;minus p2;cout << "30 - 15 = " << p2(30, 15) << endl;cout << string(len, '-') << endl;cout << "乘法仿函数\tmultiplies" << endl;multiplies p3;cout << "30 × 15 = " << p3(30, 15) << endl;cout << string(len, '-') << endl;cout << "除法仿函数\tdivides" << endl;divides p4;cout << "30 ÷ 15 = " << p4(30, 15) << endl;cout << string(len, '-') << endl;cout << "取模仿函数\tmodulus" << endl;divides p5;cout << "30 % 15 = " << p5(30, 15) << endl;cout << string(len, '-') << endl;
}
总结: 使用内建函数对象时,需要引入头文件 #include
功能描述: 实现关系对比
仿函数原型:
template bool equal_to
//等于template bool not_equal_to
//不等于template bool greater
//大于template bool greater_equal
//大于等于template bool less
//小于template bool less_equal
//小于等于代码示例:
void printVector(vector& v)
{for (vector::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 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 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 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());printVector(v3);cout << string(len, '-') << endl;
}
可以看到sort源码也使用了内建函数对象 less 小于,所以sort默认是升序排序规则
总结: 关系仿函数中最常用的就是greater<>大于
功能描述: 实现逻辑运算
函数原型:
template bool logical_and
//逻辑与template bool logical_or
//逻辑或template bool logical_not
//逻辑非代码示例:
void printVector(vector& v)
{for (vector::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}void test1()
{int len = 20;cout << "v1:";vector 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 v2;//v2预留v的空间大小v2.resize(v.size());//transform搬运算法transform(v.begin(), v.end(), v2.begin(), logical_not());cout << "\nv2:";printVector(v2);cout << string(len, '-') << endl;
注意:
总结: 逻辑仿函数实际应用较少,了解即可