首页 > 其他分享 >STL-函数对象和谓词

STL-函数对象和谓词

时间:2023-12-25 18:02:26浏览次数:34  
标签:函数 STL back int 对象 谓词 push

2 STL- 函数对象

2.1 函数对象

2.1.1 函数对象概念

概念:

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

本质:

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

2.1.2 函数对象使用

特点:

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

示例:

#include <string>

//1、函数对象在使用时,可以像普通函数那样调用, 可以有参数,可以有返回值
class MyAdd
{
public :
	int operator()(int v1,int v2)
	{
		return v1 + v2;
	}
};

void test01()
{
	MyAdd myAdd;
	cout << myAdd(10, 10) << endl;
}

//2、函数对象可以有自己的状态
class MyPrint
{
public:
	MyPrint()
	{
		count = 0;
	}
	void operator()(string test)
	{
		cout << test << endl;
		count++; //统计使用次数
	}

	int count; //内部自己的状态
};
void test02()
{
	MyPrint myPrint;
	myPrint("hello world");
	myPrint("hello world");
	myPrint("hello world");
	cout << "myPrint调用次数为: " << myPrint.count << endl;
}

//3、函数对象可以作为参数传递
void doPrint(MyPrint &mp , string test)
{
	mp(test);
}

void test03()
{
	MyPrint myPrint;
	doPrint(myPrint, "Hello C++");
}

int main() {

	test01();
	test02();
	test03();

	system("pause");

	return 0;
}

STL-函数对象和谓词_#include

总结:

  • 仿函数写法非常灵活,可以作为参数进行传递。

2.2 谓词

2.2.1 谓词概念

概念:

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

示例:

#include <vector>
#include <algorithm>

//1.一元谓词
struct GreaterFive{
	bool operator()(int val) {
		return val > 5;
	}
};

void test01() {

	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}

	vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());
	if (it == v.end()) {
		cout << "没找到!" << endl;
	}
	else {
		cout << "找到:" << *it << endl;
	}

}

int main() {

	test01();

	system("pause");

	return 0;
}

STL-函数对象和谓词_仿函数_02

总结:参数只有一个的谓词,称为一元谓词


2.2.3 二元谓词

示例:

#include <vector>
#include <algorithm>
//二元谓词
class MyCompare
{
public:
	bool operator()(int num1, int num2)
	{
		return num1 > num2;
	}
};

void test01()
{
	vector<int> v;
	v.push_back(10);
	v.push_back(40);
	v.push_back(20);
	v.push_back(30);
	v.push_back(50);

	//默认从小到大
	sort(v.begin(), v.end());
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
	cout << "----------------------------" << endl;

	//使用函数对象改变算法策略,排序从大到小
	sort(v.begin(), v.end(), MyCompare());
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

int main() {

	test01();

	system("pause");

	return 0;
}

STL-函数对象和谓词_仿函数_03

总结:参数只有两个的谓词,称为二元谓词

标签:函数,STL,back,int,对象,谓词,push
From: https://blog.51cto.com/u_15172160/8970738

相关文章

  • # 函数类型
    函数类型在JavaScript中,有两种常见的定义函数的方式——函数声明(FunctionDeclaration)和函数表达式(FunctionExpression)。在js中,定义一个函数有一下两种方式://函数声明命名函数functionadd(x,y){returnx+y;}//函数表达式匿名函数letmyAdd=function(x,......
  • lightdb empty_clob/empty_blob 函数兼容性升级
    背景在Oracle中,长度为0的字符串被视为NULL.下文中长度为0的字符串被称为EMPTY_STRING.而PostgreSQL能够区别对待EMPTY_STRING和NULL.为了兼容Oracle的行为,在LightDB23.4版本前,已经基本将EMPTY_STRING当成了NULL.如,以下sql,select''::textisnull;......
  • 无涯教程-PostgreSQL - Functions(函数)
    PostgreSQL函数,也称为存储过程,使您能够执行通常会在数据库中的单个函数中进行多个查询和往返的操作,函数允许数据库重用,因为其他应用程序可以直接与您的存储过程进行交互,而无需中间层或重复代码。Functions-语法创建函数的基本语法如下-CREATE[ORREPLACE]FUNCTIONfuncti......
  • 如何通过云函数操作云数据库?
    本文分享自天翼云开发者社区《如何通过云函数操作云数据库?》,作者:不知不觉随着云计算的普及,云数据库作为一种高效、灵活和可靠的数据存储和管理服务,为企业提供了强大的支持。而云函数作为云计算的重要组成部分,为开发者提供了在云端执行代码的能力。本文将探讨如何通过云函数操作云......
  • CLR/C++回调函数callback和C# delegate的互相转换
    在进行CLR/C++进行开发的时候会经常遇到C++回调函数和C#的delegate之间的相互转换,例如在C++非托管类型的代码中的回调函数需要使用C#类的函数,或者是在C#代码中需要使用非托管C++的函数,这时候就需要在回调函数和delegate代理之间进行转换。C++:回调函数:typedefvoid(*pfunc)(in......
  • 【flink番外篇】5、flink的window(介绍、分类、函数及Tumbling、Sliding、session窗口
    Flink系列文章一、Flink专栏Flink专栏系统介绍某一知识点,并辅以具体的示例进行说明。1、Flink部署系列本部分介绍Flink的部署、配置相关基础内容。2、Flink基础系列本部分介绍Flink的基础部分,比如术语、架构、编程模型、编程指南、基本的datastreamapi用法、四大基......
  • C语言: 函数 值传递 || 指针传递
    在C语言中,函数可以使用指针传递和值传递来传递参数。通常情况下,使用值传递是最常见和最简单的方式。在值传递中,函数的参数会被复制一份,然后传递给函数。这意味着在函数内对参数的修改不会对原始数据产生影响。当你只需要传递一个简单的数据类型,如整数或浮点数时,值传递是......
  • 三、函数、时间格式化
    1.函数2.时间格式化  1.函数#不可变对象实例:数字、字符串、元组,如数字,变量赋值a=5后再赋值a=10,这里实际是新生成一个int值对象10,再让a指向它,而5被丢弃,不是改变a的值,相当于新生成了a。#可变对象实例:列表、集合、字典,如变量赋值la=[1,2,3,4]后再赋值la[2]=5......
  • oracle中排序分析函数row_number()、rank()、dense_rank() 的区别
    row_number()产生的序号不会重复,即1、2、3...rank()产生的序号会重复,但是会跳号,出现1、2、2、4...的情况dense_rank()产生的序号会重复,不会跳号,会出现1、2、2、3的情况而普通的rownum是一个伪列,与你的orderby是没有关系的SELECTrow_number()over(ORDERBYac.check_number......
  • SQL的left()函数
    LEFT()是SQL中常用的字符串函数之一,用于从字符串的左侧获取指定数量的字符。以下是关于LEFT()函数的详细介绍:使用场景:截取字符串中的前几个字符:当你需要从字符串的左侧获取一定数量的字符时,可以使用LEFT()函数。处理固定长度的字符串:当数据表中的数据长度是固定的,并且你......