C++ STL 函数对象 内建函数对象-算术仿函数 关系仿函数 逻辑仿函数
创始人
2025-05-28 15:08:19

内建函数对象

文章目录

  • 内建函数对象
    • 1 内建函数对象意义
    • 2 算术仿函数
    • 3 关系仿函数
    • 4 逻辑仿函数

1 内建函数对象意义

概念: STL内建了一些函数对象,已经提供了一些仿函数,提高代码复用率

分类:

  • 算术仿函数 算术上的加、减、乘、除等

  • 关系仿函数 关系上的相等、不等、大于、小于等

  • 逻辑仿函数 逻辑上的与、或、非等

用法:

  • 这些仿函数所产生的对象,用法和一般函数完全相同
  • 使用内建函数对象,需要引入头文件 #include

2 算术仿函数

功能描述:

  • 实现四则运算
  • 其中negate是一元运算,其他都是二元运算,注意这个元指的是参数,不是参数类型

仿函数原型:

  • 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

3 关系仿函数

功能描述: 实现关系对比

仿函数原型:

  • 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<>大于

4 逻辑仿函数

功能描述: 实现逻辑运算

函数原型:

  • 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;

在这里插入图片描述
注意:

  • transform是搬运算法,第一个参数是源容器起始迭代器,第二个参数是源容器接受迭代器,第三个是目的容器起始迭代器,最后是仿函数。仿函数功能是加减乘除、与或非都可以。
  • transform搬运前,目的容器需要开辟空间,否则无法搬运

总结: 逻辑仿函数实际应用较少,了解即可

相关内容

热门资讯

玩家攻略科普“六六顺牛牛.怎么... 您好:六六顺牛牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9158489】很多玩家在这款游...
重大通报“乐酷大厅其实是有透视... 您好:乐酷大厅这款游戏可以开挂,确实是有挂的,需要软件加微信【5902455】,很多玩家在乐酷大厅这...
今日.热议“红心自由麻将到底有... 您好:红心自由麻将这款游戏可以开挂,确实是有挂的,需要软件加微信【5382285】,很多玩家在红心自...
(实测讲解)“毛豆炸金花可以开... 您好:毛豆炸金花这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在这款游...
重磅分享“中天游戏能开挂吗”原... 您好:中天游戏这款游戏可以开挂,确实是有挂的,需要软件加微信【9547355】很多玩家在这款游戏中打...