首页 > 编程语言 >详解C++STL—函数对象

详解C++STL—函数对象

时间:2023-05-21 10:07:01浏览次数:38  
标签:函数 STL back C++ int 详解 template push cout

1、函数对象

1.1、函数对象概念

概念:

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


本质:

函数对象(仿函数)是一个,不是一个函数


1.2、函数对象的使用

特点:

  • 函数对象在使用时,可以像普通函数那样调用, 可以有参数,可以有返回值
  • 函数对象超出普通函数的概念,函数对象可以有自己的状态
  • 函数对象可以作为参数传递


示例:

//函数对象的特点
class myAdd {
public:
	myAdd() {
		this->count = 0;
	}
	int operator()(int a,int b) {
		count++;
		return a + b;
	}
	int count;
};

//1、函数对象在使用时,可以像普通函数那样调用, 可以有参数,可以有返回值
void test01() {
	myAdd add;
	cout <<"test01两数之和:"<< add(1, 2) << endl;
}

//2、函数对象超出普通函数的概念,函数对象可以有自己的状态
void test02() {
	myAdd add;
	cout << "test02两数之和:" << add(1, 2) << endl;
	cout << "test02两数之和:" << add(2, 3) << endl;
	cout << "test02两数之和:" << add(3, 4) << endl;
	cout << "test02add,调用次数:" << add.count << endl;
}

//3、函数对象可以作为参数传递
void doAdd(myAdd add,int a,int b) {
	cout << "test03两数之和:" << add(a,b) << endl;
}
void test03() {
	myAdd add;
	doAdd(add,5,6);
}

int main() {
	
	test01();
	test02();
	test03();
	system("pause");
	return 0;
}

详解C++STL—函数对象_学习笔记


2、谓词

2.1、谓词概念

概念:

  • 返回bool类型的仿函数称为谓词
  • 如果operator()接受一个参数,那么叫做一元谓词
  • 如果operator()接受两个参数,那么叫做二元谓词

2.2、一元谓词

示例:

#include<vector>
#include<algorithm>

//一元谓词
class greaterFive {
public:
	bool operator()(int a) {
		return a > 5;
	}
};
void test01() {
	vector<int> v;
	for (int i = 0; i < 10;i++) {
		v.push_back(i);
	}

	//greaterFive() 匿名对象
	//find_if(),找到返回该位置迭代器,未找到返回end();
	vector<int>::iterator it = find_if(v.begin(),v.end(),greaterFive());
	if (it == v.end()) {
		cout << "未找到" << endl;
	}
	else {
		cout << "找到了,为:" << *it << endl;
	}
}

int main() {
	test01();
}

详解C++STL—函数对象_STL_02

2.3、二元谓词

#include<vector>
#include<algorithm>

//二元谓词
class myCompare {
public:
	bool operator()(int a,int b) {
		return a > b;
	}
};
void test01() {
	vector<int> v;
	v.push_back(10);
	v.push_back(50);
	v.push_back(40);
	v.push_back(30);
	v.push_back(70);

	//sort(),默认升序
	sort(v.begin(),v.end());
	for (int i = 0; i < v.size();i++) {
		cout << v[i] << " ";
	}
	cout << endl;

	//利用二元谓词,改变排序规则
	sort(v.begin(), v.end(),myCompare());
	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << " ";
	}
	cout << endl;

}

int main() {
	test01();
	system("pause");
}

详解C++STL—函数对象_学习笔记_03

3、内建函数对象

3.1、理解内建函数对象

概念:

  • STL内建了一些函数对象

分类:

  • 算术仿函数
  • 关系仿函数
  • 逻辑仿函数

用法:

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

3.2、算术仿函数

功能描述:

  • 实现四则运算
  • 其中negate是一元运算,其他都是二元运算

仿函数原型:

  • template<class T> T plus<T> //加法仿函数
  • template<class T> T minus<T> //减法仿函数
  • template<class T> T multiplies<T> //乘法仿函数
  • template<class T> T divides<T> //除法仿函数
  • template<class T> T modulus<T> //取模仿函数
  • template<class T> T negate<T> //取反仿函数


示例:

void test01() {
	//一元运算 negate
	negate<int> n;
	int a = 10;
	cout << "a取反:" << n(a) << endl;

	//二元运算
	plus<int> p;	//+
	cout << "plus:" << p(1,2) << endl;

	minus<int> m;	//-
	cout << "minus:" << m(1, 2) << endl;

	multiplies<int> mp;	//*
	cout << "multiplies:" << mp(1, 2) << endl;

	divides<int> d;	// /
	cout << "divides:" << d(4, 2) << endl;

	modulus<int> md;
	cout << "modulus:" << md(3, 2) << endl;
}


int main() {
	test01();
	system("pause");
	return 0;
}

详解C++STL—函数对象_学习笔记_04

3.3、关系仿函数

功能描述:

  • 实现关系对比

仿函数原型:

  • template<class T> bool equal_to<T> //等于
  • template<class T> bool not_equal_to<T> //不等于
  • template<class T> bool greater<T> //大于
  • template<class T> bool greater_equal<T> //大于等于
  • template<class T> bool less<T> //小于
  • template<class T> bool less_equal<T> //小于等于


示例:

//关系仿函数
void test01() {
	
	vector<int> v;
	v.push_back(10);
	v.push_back(30);
	v.push_back(50);
	v.push_back(20);
	v.push_back(40);
	for (int i = 0; i < v.size();i++) {
		cout << v[i] << " ";
	}
	cout << endl;

	//默认降序 less<T>()
	sort(v.begin(),v.end());
	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << " ";
	}
	cout << endl;

	//使用greater<T>(),改变规则为升序
	sort(v.begin(),v.end(),greater<int>());
	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << " ";
	}
}

int main() {
	test01();
}

详解C++STL—函数对象_STL_05

3.4、逻辑仿函数

功能描述:

  • 实现逻辑运算

函数原型:

  • template<class T> bool logical_and<T> //逻辑与
  • template<class T> bool logical_or<T> //逻辑或
  • template<class T> bool logical_not<T> //逻辑非


示例:

//逻辑仿函数
void test01() {

	vector<bool> v;
	v.push_back(true);
	v.push_back(false);
	v.push_back(true);
	v.push_back(false);
	v.push_back(true);
	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << " ";
	}
	cout << endl;

	//将v搬运到v2中,并执行逻辑取反
	vector<bool> v2;
	v2.resize(v.size());

	transform(v.begin(),v.end(),v2.begin(),logical_not<bool>());
	for (int i = 0; i < v2.size(); i++) {
		cout << v2[i] << " ";
	}
	cout << endl;

}

int main() {
	test01();
}

详解C++STL—函数对象_函数对象_06

标签:函数,STL,back,C++,int,详解,template,push,cout
From: https://blog.51cto.com/qiux/6318602

相关文章

  • 为什么只有Python可以爬虫,C++可以吗?
    Python(英国发音:/ˈpaɪθən/;美国发音:/ˈpaɪθɑːn/),是一种广泛使用的解释型、面向对象、动态数据类型的高级程序设计语言。Python支持多种编程范型,包括结构化、过程式、反射式、面向对象和函数式编程。它拥有动态类型系统和垃圾回收功能,能够自动管理内存使用,并且其本身拥有一个......
  • c++打卡第三十二天
    以点类Point及平面图形类Plane为基础设计圆类Circle一、问题描述以点类Point及平面图形类Plane为基类公有派生圆类Circle,main(void)函数完成对其的测试。Point类结构说明:Point类的数据成员包括:①私有数据成员:X坐标x(double型),Y坐标y(double型)。Point类成员函数包括:①有参构造......
  • [Linux]香橙派orangepi下ubuntu SSH安装步骤详解
    Linux下SSH安装步骤详解(linux中ssh安装)SSH(SecureShell)是一种加密的工具,可以安全地在网上进行数据交换,是远程安全服务器登录等功能建立在现有网络环境中的一种基本安全协议。本文介绍在Linux系统中安装SSH的方法,以Ubuntu18.04为例。一、安装openssh-server我们首先要安装openss......
  • C/C++程序设计课设题[2023-05-20]
    C/C++程序设计课设题[2023-05-20]ATM仿真系统-薛景背单词-叶水仙-理科实验班电信优惠套餐推荐系统的设计与实现-朱立华-通信工程多媒体文件管理及检索系统-刘林峰-广播电视工程公交路线自动化选择系统实现-张勤-测控技术与仪器基于朋友圈的商品推荐-汪云云-自动化基于数据......
  • vscode c++链接mongo数据库的操作随笔
     1、需要先下载安装各种软件及依赖1)c++链接mongo数据库需要涉及到这几个库,而且版本直接有范围boostcmakelibbsonmingwmongo-copensslgccmongocxx  2、vscode安装,用vscode的好处就是会省事情很多1)下载安装vscode2022版本2)也可以用vscode进行安装上面的各种类库......
  • 【重学C++】01| C++ 如何进行内存资源管理?
    文章首发【重学C++】01|C++如何进行内存资源管理?前言大家好,我是只讲技术干货的会玩code,今天是【重学C++】的第一讲,我们来学习下C++的内存管理。与java、golang等自带垃圾回收机制的语言不同,C++并不会自动回收内存。我们必须手动管理堆上内存分配和释放,这往往会导致内存泄漏......
  • C++中动态和静态库(dll) 使用(转)
    目录:1.lib与dll介绍2.动态库的生成与使用3.静态库的生成与使用 1.首先介绍下静态库(静态链接库,.lib文件),动态库*(动态链接库,.dll文件)的概念,两者都是代码共享的方式.静态链接:静态链接是指在编译的时候就把模块的内容加载进来一起编译,这样编出来的exe文件包含了模块......
  • 使用JSTL 通过taglib标签引入所需的标签库 uri属性没有提示
     首先找到这两个支持jar包 然后添加到项目的web下面的WEB-INF-->lib(没有的话自己建)下接着 鼠标在项目上右键Addaslibrary,下拉列表选择projectlibrary或者Module Library都可以。  ......
  • C/C++学生宿舍管理系统[2023-05-20]
    C/C++学生宿舍管理系统[2023-05-20]课程报告任务书题目学生宿舍管理系统主要内容用C语言开发一个简单的学生宿舍管理系统。实现宿舍信息管理,用户信息管理以及住宿管理功能。【数据结构】1.宿舍信息。包括:宿舍编号、所属楼号,所属楼层、面积、床位数等。2.登陆账号信息。包括:......
  • c和c++各种类型数据左移溢出对比
    cint:1#include<stdio.h>2main(){3//int4intj=1;//<<31==21474836485//1<<32==16//(1<<32)-1==07//(1<<32)-2==42949672958for(inti=30;i<(1<<5)+1;i......