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搬运前,目的容器需要开辟空间,否则无法搬运

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

相关内容

热门资讯

豆包手机重启限量发售!此前传被... 本文来源:时代周报 作者:何珊珊因AI接管功能迅速走红的豆包手机再次开放少量购买资格,此前它已接连深...
治不了阿尔兹海默还治不了你 今天看到复星医药准备花14亿把神药公司绿谷给买了,那乃悟作为绿谷的老朋友高低得来两句。绿谷现在最广为...
放弃控制权、索赔额大减36%!... 广州轻工工贸集团有限公司(下称“广州轻工集团”)放弃良品铺子了。12月16日,良品铺子发布公告称,广...
知名富翁疯狂代孕,吓坏美国法官... 近日,有媒体报道,一位中国亿万富翁在美国 “疯狂”代孕,吓得法官否了他的亲权申请。而这位富翁,正是多...
用12个问题,开启更有钱的20... 点击 “简七读财” ,发送消息“ 理财 ”小白轻松入门~晚上好,我是简七~上周我去了一趟普陀山,在...