C++11包装器

news2024/11/15 20:09:37

文章目录

  • 1.当前程序的问题
  • 2.包装器的引入
    • 2.1包装器的定义
    • 2.2包装器的使用
    • 2.3包装器的出现对于2.1问题的解决
  • 3.包装器的应用
    • 3.1C++98写法
    • 3.2C++11写法
      • count()的用法
      • 下标运算符operator[ ]
      • lambda表达式的另一种用法
      • C++11写法

在这里插入图片描述

1.当前程序的问题

template<class T, class K>
K useFun(T fun, K x)
{
	//count是一个static对象 当这个函数结束 count不会被销毁
	static int count = 0;
	//每次使用这个函数 输出count+1的值 
	//如果是同一个函数 count会输出1 2 3
	//而运行结果是 1 1 1 说明这个函数模板被实例化成3个不同的函数
	cout << "count:" << ++count << endl;
	//每次使用这个函数 输出count的地址
	cout << "count:" << &count << endl;

	return fun(x);//fun可能是一个函数名\函数指针\函数对象\lambda表达式
}


int func(int x)
{
	return x;
}

struct Functor
{
	int operator()(int x)
	{
		return x;
	}
};

int main()
{
	// 函数指针
	cout << useFun(func, 1) << endl;

	// 函数对象
	cout << useFun(Functor(), 2) << endl;

	// lamber表达式对象
	auto ret = useFun
	(
		[](int x)->int
		{
			return x;
		}
	, 3);
	cout << ret << endl;
	return 0;
}

通过运行结果我们可以看到useFun函数模板被实例化了三份
在useFun函数模板中 count是一个static对象
当这个函数结束 count不会被销毁
每次使用这个函数 输出count+1的值
如果是同一个函数 count会输出1 2 3
而运行结果是 1 1 1 说明这个函数模板被实例化成3个不同的函数
通过count的地址也可以看出这是三个不同的count

在这里插入图片描述

问题来了 怎么能让useFun函数模板不被实例化成3份呢?这是包装器的作用就显现出来了

2.包装器的引入

2.1包装器的定义

#include<functional>
// 类模板原型如下
template <class T> 
function;

template <class Ret, class... Args>
class function<Ret(Args...)>;
模板参数说明:
Ret: 被调用函数的返回类型
Args…:被调用函数的形参

2.2包装器的使用

int fun(int a, int b)
{
	return a + b;
}

struct Functor
{
public:
	int operator() (int a, int b)
	{
		return a + b;
	}
};

class PLus
{
public:
	static int plus_int(int a, int b)
	{
		return a + b;
	}

	double plus_double(double a, double b)
	{
		return a + b;
	}
};

int main()
{
	function<int(int, int)> f1 = fun;
	cout << f1(1, 2) << endl;

	function<int(int, int)> f2 = Functor();
	cout << f2(1, 2) << endl;

	//静态成员函数通过类名直接访问方式
	function<int(int, int)> f3 = PLus::plus_int;
	cout << f3(1, 2) << endl;
	//非静态成员函数通过类名直接访问方式
	function<double(PLus,double, double)> f4 = &PLus::plus_double;
	f4(PLus(), 1.1, 2.2);

	return 0;
}

2.3包装器的出现对于2.1问题的解决

template<class T, class K>
T useFun(K fun, T x)
{
	staic int count = 0;
	cout << "count:" << ++count << endl;
	cout << "count:" << &count << endl;

	return fun(x);
}


int func(int x)
{
	return x;
}

struct Functor
{
	int operator()(int x)
	{
		return x;
	}
};

int main()
{
	// 函数指针
	function<int(int)> f1 = func;
	cout << useFun(f1, 1) << endl;

	// 函数对象
	function<int(int)> f2 = Functor();
	cout << useFun(f2, 2) << endl;

	// lamber表达式对象
	function<int(int)> f3 = [](int x)->int {return x; };

	cout << useFun(f3, 3) << endl;
	return 0;
}

在这里插入图片描述

3.包装器的应用

逆波兰表达式求值
在这里插入图片描述
在这里插入图片描述

3.1C++98写法

class Solution 
{
public:
	//Evaluate inverse Polish notation
	int evalRPN(vector<string>& tokens)
	{
		stack<long long> st;
		for (auto& str : tokens)
		{
			if (str == "+" || str == "-" 
			 || str == "*" || str == "/" )
			{
				long long right = st.top();
				st.pop();
				long long left = st.top();
				st.pop();
				switch (str[0])
				{
				case '+':
					st.push(left + right);
					break;
				case '-':
					st.push(left - right);
					break;
				case '*':
					st.push(left * right);
					break;
				case '/':
					st.push(left / right);
					break;
				}
			}
			else
			{
				st.push(stoll(str));
			}
		}
		return st.top();
	}
};

3.2C++11写法

count()的用法

在这里插入图片描述

如果容器包含键等于k的元素,则为1,否则为零。成员类型size_type是一个无符号整数类型。

下标运算符operator[ ]

在这里插入图片描述

如果k与容器中某个元素的键匹配,则函数将返回对其映射值的引用。如果k与容器中任何元素的键都不匹配,则函数将插入一个具有该键的新元素,并返回对其映射值的引用。请注意,即使没有为元素分配映射值(该元素是使用其默认构造函数构造的),这也会使容器大小增加一。类似的成员函数map::at在具有键的元素存在时具有相同的行为,但在不存在时抛出异常。

lambda表达式的另一种用法

template<class T, class K>
T useFun(K fun, T x)
{
	static int count = 0;
	cout << "count:" << ++count << endl;
	cout << "&count:" << &count << endl;

	return fun(x);
}


int func(int x)
{
	return x;
}

struct Functor
{
	int operator()(int x)
	{
		return x;
	}
};

int main()
{
	// 函数指针
	function<int(int)> f1 = func;
	cout << "func(1) == " << func(1) << endl; 
	cout << useFun(f1, 1) << endl;
	cout << endl;

	// 函数对象
	function<int(int)> f2 = Functor();
	cout << "Functor()(1) == " << Functor()(1) << endl;
	cout << useFun(f2, 2) << endl;
	cout << endl;

	// lamber表达式对象
	function<int(int)> f3 = [](int x)->int {return x; };
	cout << "[](int x)->int {return x; }(1) == " << [](int x)->int {return x; }(1) << endl;
	cout << useFun(f3, 3) << endl;
	return 0;
}

在这里插入图片描述

C++11写法

class Solution
{
	typedef long long Long;
public:
	int evalRPN(vector<string>& tokens)
	{
		stack<Long> st;
		//m初始化时 插入4个数据 
		//key分别是 + - * /
		//value是lambda表达式 
		//分别是对应key所能进行的运算
		map< string, function<Long(Long, Long)> > m =
		{
			{"+", [](Long a, Long b) { return a + b; }},
			{"-", [](Long a, Long b) { return a - b; }},
			{"*", [](Long a, Long b) { return a * b; }},
			{"/", [](Long a, Long b) { return a / b; }}
		};
		for (auto& e : tokens)
		{
			//m中只存储了+-*/四个字符 
			//所以对于tokens中的数字count返回0
			//对于运算符返回1

			//是运算符
			if (m.count(e))
			{
				Long right = st.top();
				st.pop();
				Long left = st.top();
				st.pop();

				//m[e]: m将e作为key值去查找 返回e对应的value
				st.push(m[e](left, right));
			}
			//是数字
			else
				st.push(stoll(e));
		}
		return st.top();
	}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1113965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MSC应用新进展

2023年9月23日&#xff0c;第四届中国干细胞与再生医学协同创新平台大会正式发布了我国首个人源干细胞国家标准《生物样本库多能干细胞管理技术规范》(GB/T42466-2023)&#xff0c;标志着我国在干细胞样本库管理上有了标准技术支撑&#xff0c;对于推动我国干细胞研究和应用的规…

React之Redux详解

一、Redux 1、是什么 React是用于构建用户界面的&#xff0c;帮助我们解决渲染DOM的过程 而在整个应用中会存在很多个组件&#xff0c;每个组件的state是由自身进行管理&#xff0c;包括组件定义自身的state、组件之间的通信通过props传递、使用Context实现数据共享 如果让…

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.8 绘图事件

本节对应的视频讲解&#xff1a;B_站_链_接 【QT开发笔记-基础篇】 第4章 事件 4.8 绘图事件(1) 本章要实现的整体效果如下&#xff1a; QEvent::Paint ​ 当窗口/控件需要重绘时&#xff0c;触发该事件&#xff0c;它对应的子类是 QPaintEvent 本节通过一个向 QLabel 上绘制…

“揭秘!如何通过京东商品详情接口轻松获取海量精准商品信息!“

京东商品详情接口可以通过HTTP GET请求获取商品详情信息。 请求参数包括num_iid&#xff0c;表示JD商品ID。 请求示例&#xff1a; GET /jd/item_get/?num_iid10335871600 HTTP/1.1 Host: api-vx.Taobaoapi2014.cn Connection: close Accept-Encoding: gzip 点击获取…

决策树深度探索: 从基础构建到机器学习应用

机器学习 第六课 决策树 概述决策树的基本概念决策树的应用决策树的基本构建节点 (Node)分支 (Branch)决策树的构造过程 信息增益熵 (Entropy)条件熵 (Conditional Entropy)信息增益 (Information Gain) 信息熵计算计算数据集的熵计算在给定属性条件下的熵计算信增益 (Informat…

深入剖析Java类加载过程:探寻类加载器的奥秘

摘要: 一个java文件从被加载到被卸载这个生命过程&#xff0c;总共要经历4个阶段&#xff1a; 加载->链接&#xff08;验证准备解析&#xff09;->初始化&#xff08;使用前的准备&#xff09;->使用->卸载 其中类加载过程包括加载、验证、准备、解析和初始化五个阶…

如何使用Abaqus import进行预应力跌落仿真

跌落测试除了单次跌落外&#xff0c;根据不同的标准需求&#xff0c;还有多次跌落或者预应力跌落&#xff0c;上次我们进行了单次跌落在Abaqus中的实现过程&#xff0c;今天我们使用Abaqus Import功能&#xff0c;进行卡扣的预应力跌落。 首先进行卡扣的装配仿真&#xff0c;在…

Note——time

time import import datetime import timeDefinition of time from 1970-01-01 00:00:00 UTC Coordinated Universal Time as the float format of ‘seconds’ For example use structured time lists [ year,month,day,hours,minutes,seconds…] 表示从1970-01-01 00:00:…

当苹果铅笔不能工作时,不一定都是苹果铅笔的问题!苹果铅笔不工作时如何修复

你的苹果铅笔没有按预期工作,可能有几个原因;大多数都有相当简单的修复方法。苹果铅笔的故障排除技巧在两代配件中基本相同。 本文中的信息适用于兼容iPad上的苹果铅笔(第二代)和苹果铅笔(第一代)。 检查蓄电池 苹果铅笔的电池必须充电才能工作。要检查iPad上的电池状…

云表:为什么要使用低代码开发?低代码选择指南

随着信息技术的不断发展&#xff0c;我们进入了一个数字化的时代。在这个时代&#xff0c;IT技术已经成为推动全球信息化浪潮的重要力量。然而&#xff0c;随着应用程序开发技术的不断发展&#xff0c;开发效率并没有像摩尔定律一样快速提升&#xff0c;反而成为了瓶颈。因此&a…

Django实现音乐网站 (21)

使用Python Django框架做一个音乐网站&#xff0c; 本篇音乐播放器功能完善及原有功能修改。 目录 播放列表修改 视图修改 删除、清空播放器 设置路由 视图处理 修改加载播放器脚本 模板修改 脚本设置 清空功能实现 删除列表音乐 播放列表无数据处理 视图修改 播放…

uniapp自定义右击菜单

效果图&#xff1a; 代码&#xff1a; 1、需要右击的view: <view class"answer-box" contextmenu.stop.prevent.native"showRightMenu($event, item, content)"> </view>2、右击弹出层&#xff1a; <view v-if"visible" :styl…

001.第一个C语言项目

Visual studio2022的使用 创建第一个C语言项目和源文件 https://blog.csdn.net/qq_45037165/article/details/124520286 第一个C语言项目 #include<stdio.h> int main() {printf("Hello World");return 0; }运行结果&#xff1a; 第一行为库函数&#xff0…

docker容器健康状态健康脚本

代码&#xff1a; #!/bin/bash# 定义要监控的容器名称 container_name"mysql-container"# 使用Docker命令来检查容器的运行状态 container_status$(docker inspect --format"{{.State.Status}}" "$container_name")# 检查容器状态并进行相应操作…

PAM从入门到精通(十五)

接前一篇文章&#xff1a;PAM从入门到精通&#xff08;十四&#xff09; 本文参考&#xff1a; 《The Linux-PAM Application Developers Guide》 先再来重温一下PAM系统架构&#xff1a; 更加形象的形式&#xff1a; 六、整体流程示例 1. 官方文档中的例程及解析 从PAM从入…

数字人引领政务革新,AI智慧政务一体机的未来服务之路

数字人、数字员工&#xff0c;已是当下不可忽视的新型劳动者&#xff0c;它们在众多领域频频出圈&#xff0c;持续打破人们的固有认知。在近期公布的2023数字人实践案例TOP10里&#xff0c;CCTV央视网数字代言人阿央”带领新一代青年紧跟国家大事、关注国家发展&#xff1b;首位…

Java操作Python及数据交互最佳实践

Java操作Python最佳实践 1、Java与Python的互操作性2、Java调用Python脚本及数据交互2.1、准备工作2.2、执行一段Python代码2.3、执行Python文件脚本2.4、执行Python文件中的指定方法2.5、执行含有第三方库的Python文件3、附录(完整代码)1、Java与Python的互操作性 在当今的软…

Mac电脑无法识别移动硬盘怎么办?

很多人都喜欢在Mac电脑上办公、学习&#xff0c;但有时我们将移动硬盘连接Mac电脑时&#xff0c;却会发现电脑无法识别移动硬盘。那么&#xff0c;Mac电脑无法识别移动硬盘怎么办呢&#xff1f; Mac无法识别移动硬盘的原因 导致Mac不识别移动硬盘的原因有很多&#xff0c;你可…

交换机知识汇总大全,值得收藏!

下午好&#xff0c;我的网工朋友。 说到网工相关的网络设备&#xff0c;你的第一反应是啥&#xff1f;答案基本上都是交换机&#xff0c;是吧。 交换机作为网工最常用的设备之一&#xff0c;你懂多少&#xff1f; 今天想带你温顾一番交换机的基础知识&#xff0c;顺便说说&a…