0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

c++之函数对象与内建函数

wang123a 来源:wang123a 作者:wang123a 2023-07-17 09:46 次阅读

1.函数对象

  • 函数对象(仿函数):
    重载函数调用操作的类,其对象常称之为函数对象;
    函数对象使用重载()时,其行为类似函数调用,也叫仿函数;
  • 函数对象本质:

函数对象(仿函数)本质是一个类,不是一个函数。

  • 函数对象特点:

函数对象在使用时可以有形参、有返回值。
函数对象可以有自己的状态值。
函数对象可以作为函数形参。

使用示例:

#include < iostream >
using namespace std;
class myfunc
{
public:
	myfunc()
	{
		count = 0;
	}
	//求和示例,重载()
	int operator()(int a, int b)
	{
		return a + b;
	}
	//输出示例,count记录函数调用次数
	void operator()(string str)
	{
		count++;
		cout < < str < < endl;
	}
	int count;
};
void print(myfunc& p, string test)
{
	p(test);
}
void test()
{
	//创建一个函数对象
	myfunc p1;
	cout < < "t函数对象形参返回使用示例:" < < endl;
	int ret=p1(10, 20);
	cout < < "ret=" < < ret < < endl;
	cout < < "t仿函数重载示例:" < < endl;
	p1("C++学习--仿函数使用示例!");
	p1("C++学习--仿函数使用示例!");
	p1("C++学习--仿函数使用示例!");
	cout < < "函数调用次数:" < < p1.count < < endl;
	cout < < "t仿函数作为函数形参:" < < endl;
	print(p1, "hello,欢迎学习c++课程");
}
int main()
{
	test();
	system("pause");
}
wKgaomSzow6AR7vbAAV4tKPvhz8386.png

2.谓词

  • 谓词:
    函数对象返回值为bool类型,则称之为谓词;
  • 一元谓词:
    仿函数的形参只有一个;
  • 二元谓词:
    仿函数的形参有两个参数
#include < iostream >
#include < vector >
#include < algorithm >
using namespace std;
class Check
{
public:
	bool operator()(int val)
	{
		return val > 5;
	}
	bool operator()(int a1,int a2)
	{
		return a1 > a2;
	}
};
void test()
{
	vector< int >vtr;
	/*插入数据*/
	for (int i = 0; i < 10; i++)
	{
		vtr.push_back(i);
	}
	cout < < "一元谓词示例:查找vector容器中 >5的值" < < endl;
	/*查找vector容器中 >5的值*/
	vector< int >::iterator ret=find_if(vtr.begin(), vtr.end(), Check());//Check()  ---匿名函数对象
	if (ret ==vtr.end())
	{
		cout < < "未查到到 >5的值!" < < endl;
	}
	else
	{
		cout < < "查找成功,大于5的值为:" < <*ret< ::iterator ptr = vtr.begin(); ptr != vtr.end(); ptr++)
	{
		cout < < *ptr < < " ";
	}
	cout < < endl;
}
int main()
{
	test();
	system("pause");
}
;>
wKgaomSzo36AfA7AAARZcc40veA240.png

3.内建函数对象

  • 内建函数对象:
    STL中提供了一些内建函数对象:算术仿函数、关系仿函数、逻辑仿函数 --头文件

3.1算术运算符

  • 算术仿函数:实现四则运算。

加法:template T plus
减法:template T minus
乘法:template T mutiplies
除法:template T divides
取模:template T modulus
取反:template T negate --正数变负数,负数变正数

注意:其中negate是一元运算(只有一个参数),其余均为二元运算。

#include < iostream >
using namespace std;
#include < functional >
void test()
{
	//negate使用示例:
	negate< int > n;
	cout < < "negate取反示例:" < < n(188) < < endl;
	plus< int > p;
	cout < < "plus加法:" < < p(10, 20) < < endl;
	minus< float >m;
	cout < < "minus减法取绝对值:" < < n(m(10, 20)) < < endl;
	multiplies< float >mt;
	cout < < "multiplies乘法:" < < mt(5, 3.15) < < endl;
	divides< float >d;
	cout < < "divides除法:" < < d(10, 3) < < endl;
	modulus< int >md;
	cout < < "modulus取模:" < < md(10, 3) < < endl;
}
int main()
{
	test();
	system("pause");
}

3.2关系运算符

  • 内建仿函数:关系运算符

大于: templatebool greater

大于等于:templatebool greater_equal

小于: templatebool less

小于等于:templatebool less_equal

等于: templatebool equal_to

不等于: templatebool not_equal_to

#include < iostream >
using namespace std;
#include < functional >
#include < vector >
#include < algorithm >
void print(int val)
{
	cout < < val < < " ";
}
int main()
{
	vector< int > vtr;
	vtr.push_back(10);
	vtr.push_back(40);
	vtr.push_back(30);
	vtr.push_back(60);
	vtr.push_back(6);
	/*sort排序,默认是从小到大,其默认的仿函数即less*/
	sort(vtr.begin(), vtr.end());
	for_each(vtr.begin(), vtr.end(), print);
	cout < < endl;
	/*
		要实现从大小,可以自行实现一个仿函数
		class mycompare
		{
		public:
			bool operator()(int a1,int a2)
			{
				return a1 >a2;
			}
		}
		也可以直接使用STL内建仿函数:greater()
	*/
	sort(vtr.begin(), vtr.end(), greater< int >());
	for_each(vtr.begin(), vtr.end(), print);
	cout < < endl;
	system("pause");

}
wKgZomSzpV-AOdCcAARJXftbJKg672.png

3.3逻辑运算符

  • 内建仿函数--逻辑运算符

逻辑与:templatebool logical_and
逻辑或: templatebool logical_or
逻辑非: templatebool logical_not

#include < iostream >
using namespace std;
#include < vector >
#include < algorithm >
#include < functional >
void print(bool val)
{
	cout < < val < < " ";
}
void test()
{
	vector vtr;
	vtr.push_back(true);
	vtr.push_back(true);
	vtr.push_back(false);
	vtr.push_back(false);
	vectorvtr2;
	vtr2.resize(vtr.size());//设置vtr2的容器大小
	//将vtr容器内容取非放到vtr2中
	transform(vtr.begin(), vtr.end(), vtr2.begin(), logical_not());

	for_each(vtr.begin(), vtr.end(), print);
	cout < < endl;
	for_each(vtr2.begin(), vtr2.end(), print);
	cout < < endl;
}
int main()
{
	test();
	system("pause");
}
wKgaomSzpa-AF8o4AAPxhLsIPiA710.png




审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72900
收藏 人收藏

    评论

    相关推荐

    C++函数virtual详解

    C++ 中的虚函数用于解决动态多态问题,虚函数的作用是允许在派生类中重新定义与积累同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名
    发表于 09-07 11:27 2395次阅读

    GCC内建函数问题!!!

    目前的代码中使用了GCC的内建函数__builtin_clz()和__builtin_popcount(),在CCS中编译不能通过,请问,CCS是否有库支持这两个函数,多谢!
    发表于 06-21 18:30

    C++教程之函数的递归调用

    C++教程之函数的递归调用 在执行函数 f 的过程中,又要调用 f 函数本身,称为函数的递归调用;形式上:一个正在执行的
    发表于 05-15 18:00 35次下载

    C++中的私有函数消除方法

    私有访问是 C++ 中三种访问权限的一种,是访问权限中最严格的。类对象的私有成员分私有函数和私有数据两部分,其中私有数据有特殊的作用;但是私有函数有很大的弊端,应该尽力
    发表于 06-29 15:45 38次下载
    <b class='flag-5'>C++</b>中的私有<b class='flag-5'>函数</b>消除方法

    C++课程资料详细资料合集包括了:面向对象程序设计与C++,算法,函数

    本文档的主要内容详细介绍的是C++课程资料资料合集包括了:面向对象程序设计与C++,算法,函数,概述, C++语言基础,构造数据类型,数据类
    发表于 07-09 08:00 18次下载
    <b class='flag-5'>C++</b>课程资料详细资料合集包括了:面向<b class='flag-5'>对象</b>程序设计与<b class='flag-5'>C++</b>,算法,<b class='flag-5'>函数</b>等

    如何在中断C函数中调用C++

    之前,我们在单片机程序开发时都会面对中断函数。众所周知的,这个中断函数肯定是要用C函数来定义的。我在用C++进行程序开发的时候就发现了一个需要解决了问题:在断
    发表于 05-09 18:17 0次下载
    如何在中断C<b class='flag-5'>函数</b>中调用<b class='flag-5'>C++</b>

    python函数概念理解

    函数是可以实现一些特定功能的小方法或是小程序。在Python中有很多内建函数,当然随着学习的深入,我们可以学会创建对自己有用的函数
    的头像 发表于 01-18 17:37 2094次阅读

    C++:详谈拷贝构造函数

    只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为拷贝构造函数。拷贝构造函数是特殊的构造函数,创建
    的头像 发表于 06-29 11:45 1917次阅读
    <b class='flag-5'>C++</b>:详谈拷贝构造<b class='flag-5'>函数</b>

    C++之拷贝构造函数的浅copy及深copy

    C++编译器会默认提供构造函数;无参构造函数用于定义对象的默认初始化状态;拷贝构造函数在创建对象
    的头像 发表于 12-24 15:31 525次阅读

    C++中如何用虚函数实现多态

    01 — C++函数探索 C++是一门面向对象语言,在C++里运行时多态是由虚函数和纯虚
    的头像 发表于 09-29 14:18 1471次阅读

    如何在MPLAB XC16编译器内建函数

    MPLAB XC16编译器提供了一系列内建函数,使C语言编程人员可以访问目前只能通过行内汇编访问的汇编运算符或机器指令。内建函数名都有一个前缀__builtin_,源代码用C语言编写,在句法上类似于
    的头像 发表于 01-22 17:37 1120次阅读
    如何在MPLAB XC16编译器<b class='flag-5'>内建函数</b>

    函数C++开发者如何有效利用

    函数是基类中声明的成员函数,且使用者期望在派生类中将其重新定义。那么,在 C++ 中,什么是虚函数呢?在 C++ 中,通常将虚
    的头像 发表于 02-11 09:39 664次阅读

    深度解析C++中的虚函数

    函数作为C++的重要特性,让人又爱又怕,爱它功能强大,但又怕驾驭不好,让它反咬一口,今天我们用CPU的角度,撕掉语法的伪装,重新认识一下虚函数。 虚函数
    的头像 发表于 02-15 11:14 585次阅读
    深度解析<b class='flag-5'>C++</b>中的虚<b class='flag-5'>函数</b>

    浅析C++执行构造函数编程实例

    C++保证在你调用delete时,先自动调用析构函数(而我们安排在这个函数里面删除它的法杖、法袍等对象),再删除对象占用的内存。
    发表于 03-03 15:44 173次阅读

    C++基础知识之函数1

    函数C++ 中的一个重要概念,它可以让我们将一段代码封装起来,然后在需要的时候调用它。C++ 中的函数有以下几个特点: * 函数
    的头像 发表于 04-03 10:34 349次阅读