# C++的内建函数对象 # 1. 内建函数对象 ① STL内建来了一些函数对象: 1. 算术仿函数 2. 关系仿函数 3. 逻辑仿函数 ② 用法: 1. 这些仿函数所产生的对象,用法和一般函数完全相同。 2. 使用内建函数对象,需要引入头文件 #include # 2. 算术仿函数 ① 功能描述:实现四则运算。 ② 其中negate是一元运算,其他都是二元运算。 ③ 仿函数原型: 1. $template T plus$ //加法仿函数 2. $template T minus$ //减法仿函数 3. $template T multiplies$ //乘法仿函数 4. $template T divides$ //除法仿函数 5. $template T modulus$ //取模仿函数 6. $template T negate$ //取反仿函数 ④ 使用内建函数对象时,需要引入头文件#include ```python #include using namespace std; #include //内建函数对象头文件 //内建函数对象 算术仿函数 //negate 一元仿函数 取反仿函数 void test01() { negaten; cout << n(50) << endl; } //plus 二元仿函数 加法 void test02() { plusp; //写一个int就好了,不用写两个int,它默认是两个同类型的int相加 cout << p(50,60) << endl; } int main() { test01(); test02(); system("pause"); return 0; } ``` 运行结果: - -50 - 110 - 请按任意键继续. . . # 3. 关系仿函数 ① 功能描述:实现关系对比。 ② 仿函数原型: 1. $template bool equal_to$ //等于 2. $template bool notequal_to$ //不等于 3. $template<>class T> bool greater$ //大于 4. $template bool greater_qual$ //大于等于 5. $template bool less$ //小于 6. $templatebool less_equal$ //小于等于 ③ 关系仿函数中最常用的就是greater<>大于。 ```python #include using namespace std; #include //内建函数对象头文件 #include #include //内建函数对象 关系仿函数 //大于 greater class MyCompare { bool operator()(int v1, int v2) { return v1 > v2; } }; void test01() { vectorv; v.push_back(10); v.push_back(20); v.push_back(30); v.push_back(40); v.push_back(50); for (vector::iterator it = v.begin();it!=v.end();it++) { cout << *it << " "; } cout << endl; //降序 //方式一: //sort(v.begin(), v.end(), MyCompare()); //方式二: sort(v.begin(), v.end(), greater()); //greater()为编译器给提供的函数对象,为内建的函数对象 for (vector::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } int main() { test01(); system("pause"); return 0; } ``` 运行结果: - 10 20 30 40 50 - 50 40 30 20 10 - 请按任意键继续. . . # 4. 逻辑仿函数 ① 功能描述:实现关系对比 ② 仿函数原型: 1. $template bool logical_and$ //逻辑与 2. $template bool logical_or$ //逻辑或 3. $template bool logical_not$ //逻辑非 ③ 逻辑仿函数实际应用较少,了解即可。 ```python #include using namespace std; #include //内建函数对象头文件 #include #include //内建函数对象 逻辑仿函数 //逻辑非 logical_not void test01() { vectorv; v.push_back(true); v.push_back(false); v.push_back(true); v.push_back(true); v.push_back(false); for (vector::iterator it = v.begin();it!=v.end();it++) { cout << *it << " "; } cout << endl; //利用逻辑非 将容器v 搬运到 容器v2中,并执行取反操作 vectorv2; v2.resize(v.size()); //目标容器要提前开辟一个空间 transform(v.begin(),v.end(),v2.begin(),logical_not()); //第一个参数:原容器起始迭代器,第二个参数:原容器终止迭代器,第三个参数:目标容器起始迭代器 for (vector::iterator it = v2.begin(); it != v2.end(); it++) { cout << *it << " "; } cout << endl; } int main() { test01(); system("pause"); return 0; } ``` 运行结果: - 1 0 1 1 0 - 0 1 0 0 1 - 请按任意键继续. . .