20240425,模板

感觉比学C那会好了点,不怎么出现照着抄但是就是不能跑的情况,哭死,但是学的顺又不复习,第二天跟没学一样,笑死,要是能给我开个过目不忘的挂,爽的不要不要的
呵呵呵蠢女人,别忘了你C++的作业没做,C的坑还没补

目录

模板

0.1 函数模板

开局BUG:提示对重载函数的调用不明确,是一开始图简单,三个函数名写成了 SWAPINT , SWAPDOUBLE , 模板函数是SWAP改成SWAP(A,B)没用,模板函数名改成MYSWAP报错消失​编辑

 正确

0.1.1 注意事项

0.1.2 函数模板案例——数组排序

 0.1.3 普通函数和函数模板的区别

0.1.4  普通函数和函数模板的调用规则

0.1.5 模板局限性

模板

C++另一种编程思想为泛型编程,主要利用的技术就是模板
两种机制:函数模板,类模板

0.1 函数模板

作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表
语法:template < typename T>,函数声明或定义
template--声明创建模板;typename--表明其后面的符号是一种数据类型,可以用CLASS代替;T--通用的数据类型,名称可以替换,通常为大写字母

开局BUG:提示对重载函数的调用不明确,是一开始图简单,三个函数名写成了 SWAPINT , SWAPDOUBLE , 模板函数是SWAP
改成SWAP<INT>(A,B)没用,模板函数名改成MYSWAP报错消失
#include<iostream>
using namespace std;
void swapint(int& a, int& b) {
	int temp = a;
	a = b;
	b = temp;
}
void swapdouble(double& a, double& b) {
	double temp = a;
	a = b;
	b = temp;
}
//声明一个模板,告诉编译器后面代码中紧跟着的T不要报错,T是一个通用的数据类型
template <typename T>
void swap(T &a, T &b) {
	T t= a;
	a = b;
	b = t;
}
void test01() {
	int a = 10; int b = 30;
	swapint(a, b);
	cout << a << "\t" << b << endl;
	double c = 4.333; double d = 231.21;
	swapdouble(c, d);
	cout << c << "\t" << d << endl;

	swap(a, b);
	cout << a << "\t" << b << endl;
}
int main()
{
	test01();
	system("pause");
	return 0;
}
 正确
#include<iostream>
using namespace std;
void swapint(int& a, int& b) {
	int temp = a;
	a = b;
	b = temp;
}
void swapdouble(double& a, double& b) {
	double temp = a;
	a = b;
	b = temp;
}
//声明一个模板,告诉编译器后面代码中紧跟着的T不要报错,T是一个通用的数据类型
template <typename T>
void myswap(T &a, T &b) {
	T t= a;
	a = b;
	b = t;
}
void test01() {
	int a = 10; int b = 30;
	swapint(a, b);
	cout << a << "\t" << b << endl;
	double c = 4.333; double d = 231.21;
	swapdouble(c, d);
	cout << c << "\t" << d << endl;
	//自动类型推导
	myswap(a, b);
	cout << a << "\t" << b << endl;
	myswap(c, d);
	cout << c << "\t" << d << endl;
	//显示指定类型
	myswap<int>(a, b);
	cout << a << "\t" << b << endl;
	myswap<double>(c, d);
	cout << c << "\t" << d << endl;
}
int main()
{
	test01();
	system("pause");
	return 0;
}
0.1.1 注意事项

 自动类型推导,必须推导出一致的数据类型才可以使用
模板必须要确定出T的数据类型,才可以使用(可以不调用T,但是要确定类型)

#include<iostream>
using namespace std;

template<class T>
void myswap(T& a, T& b) {
	T temp = a;
	a = b;
	b = temp;
}
template<class T>
void func() {
	cout << "function 的函数调用" << endl;
}
void test01() {
	int a = 0; int b = 77;
	double c = 43.23;
	char d = 'c';
	myswap(a, b);
	cout << a << "\t" << b << endl;
	//myswap(a, c);错误
	//func();错误
	func<int>();
	func<double>();
	func<string>();
	func<char>();
}
int main()
{
	test01();
	system("pause");
	return 0;
}
0.1.2 函数模板案例——数组排序

从大到小,排序算法为选择排序,测试CHAR数组,INT数组
函数模板使用调用数组参数时,限定的是数组的单元的数据类型……反正就那意思

#include<iostream>
using namespace std;

template<class T>
void func(T arr[], int len) {//只是用T代替不确定的数据类型,嗯,是不确定的
	for (int i = 0; i < len; i++) {
		int max=i;
		for (int j = i+1; j < len; j++) {
			if (arr[max] < arr[j]) {
				max = j;
			}
		}
		//arr[i] = max;交换,不是简单的赋值,乐
		if (i!= max) {
			T temp = arr[i];
			arr[i] = arr[max];
			arr[max] = temp;
		}
	}
}
void test01() {
	char chararr[] = { "fwsfgwegeh" };
	int intarr[] = { 2,43,4,5,3,55,2, };
	int lenchar = sizeof(chararr) / sizeof(chararr[0]);
	int lenint = sizeof(intarr) / sizeof(intarr[0]);
	cout << lenchar << " " << lenint << endl;
	for (int i = 0; i < lenchar; i++) {
		cout << chararr[i] << " ";
	}
	cout << endl;
	for (int i = 0; i < lenint; i++) {
		cout << intarr[i] << " ";
	}
	cout << endl;
	func(chararr, lenchar);
	for (int i = 0; i < lenchar; i++) {
		cout << chararr[i] << " ";
	}
	cout << endl;
	func(intarr, lenint);
	for (int i = 0; i < lenint; i++) {
		cout << intarr[i] << " ";
	}
	cout << endl;
}
int main()
{
	test01();
	system("pause");
	return 0;
}
 0.1.3 普通函数和函数模板的区别

普通函数调用时可以发生自动类型转(隐式类型转换)
函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
如果利用显示指定类型的方式,可以发生隐式类型转换
补:敲代码发现,引用方式接收参数的,都不会发生,暂时时这样的……

#include<iostream>
using namespace std;

int func(int a,int b) {
	return a + b;
}
template <class T>
T myadd(T& a, T& b) {
	return a + b;
}
template <class T>
T hhmyadd(T a, T b) {
	return a + b;
}
void test01() {
	int a = 10; int b = 50;
	char c = 'a';
	cout << func(a, b) << endl;
	cout << func(a, c) << endl;//c强制转换成了INT型ACSII码
	cout << myadd(a, b) << endl;
	//cout << myadd(a, c) << endl;//自动类型推导,不行
	//cout << myadd<int>(a, c) << endl;//显示不行
	cout << hhmyadd<int>(a, c) << endl;//显示,可以
}
int main()
{
	test01();
	system("pause");
	return 0;
}

 建议使用显示指定类型的方式

0.1.4  普通函数和函数模板的调用规则

如果都可以实现,优先调用普通函数
可以通过 空模板参数列表 来强制调用函数模板
函数模板也可以发生重载
如果函数模板可以产生更好的匹配,优先调用函数模板

#include<iostream>
using namespace std;

void func(int a,int b) {
	cout << "调用 普通 函数" << endl;
}//如果只给声明,还是调用普通,但是报错
void func(int a, int b,int c) {
	cout << "调用 普通chongzai 函数" << endl;
}

template <class T>
void func(T a, T b) {
	cout << "调用 模板" << endl;
}
template <class T>
void func(T a, T b,T c) {
	cout << "调用 重载 模板" << endl;
}
void test01() {
	int a = 10; int b = 50;
	int c = 899;
	func(a, b);
	func<>(a,b);//通过 空模板参数列表 来强制调用函数模板
	func(a, b, c);
	char c1 = 'a'; char c2 = 'c'; char c3 = 'r';
	func(c1, c2, c3);//如果函数模板可以产生更好的匹配,优先调用函数模板
	func(a, b, c1);
}
int main()
{
	test01();
	system("pause");
	return 0;
}
0.1.5 模板局限性

 传入数组-赋值操作,传入类--比较操作;无法正常运行
解决:模板的重载,可以为特定的(自定义)类型提供具体化的模板;运算符重载【感觉差不多,乐】
学习模板不是为了写模板,是为了在STL能够运用系统提供的模板

#include<iostream>
#include<string>
using namespace std;
class Person {
public:
	string m_name;
	int m_age;
	Person(string name,int age) {
		m_name = name;
		m_age = age;
	}
};
template<class T>
bool mycompare(T& a, T& b) {
	if (a == b) {
		return true;
	}
	else {
		return false;
	}
}
//为特定的类型提供具体化的模板
template<> bool mycompare(Person& a, Person& b) {
	if (a.m_name == b.m_name && a.m_age == b.m_age) {
		return true;
	}
	else {
		return false;
	}
}
void test01() {
	int a = 9; int b = 9;
	if (mycompare(a, b)) {
		cout << "xiangdeng" << endl;
	}
	else {
		cout << " bu bu bu " << endl;
	}
}
void test02() {
	Person a("张三",12);
	Person b("张三", 12);
	if (mycompare(a, b)) {
		cout << "xiangdeng" << endl;
	}
	else {
		cout << " bu bu bu " << endl;
	}
}
int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

服装厂生产ERP有哪些功能

在当今竞争激烈的服装行业中&#xff0c;企业如何在保证产品质量的同时提高生产效率和市场响应速度?答案在于智能化的生产管理。ERP(企业资源计划)系统作为现代企业管理的核心工具&#xff0c;对于服装厂而言&#xff0c;它的功能不仅需要全面&#xff0c;更要针对性强、操作简…

Python浅谈清朝秋海棠叶版图

1、清朝疆域概述&#xff1a; 清朝是我国最后一个封建王朝&#xff0c;其始于1616年建州女真部努尔哈赤建立后金&#xff0c;此后统一女真各部、东北地区。后又降服漠南蒙古&#xff0c;1644年入关打败农民起义军、灭南明&#xff0c;削三藩&#xff0c;复台湾。后又收外蒙&am…

展馆设计中必不可少的场景

1、一般场景展营造 一般场景是经过对实物进行概括、提炼&#xff0c;进行符号化、审美化的处理后引入展示现场&#xff0c;而并不是将与展品有关联的事物统统罗列其中。 2、复原场景营造 复原场景营造常用于博物馆、纪念馆陈列展示中。运用复原场景就是为了营造历史上曾存在的&…

java中2个List集合值和顺序完全一样,如果判断他们相等

和判断2个字符串是否相等一样&#xff0c;List可以通过equals来判断2个集合是否相等 示例代码如下&#xff1a; 1、相等的示例 2、顺序不一致 3、值不一致

简单使用优雅的程序计数器-StopWatch

一、引入hutool-core 5.8.18包 二、代码 public static void main(String[] args) throws InterruptedException {StopWatch stopWatch new StopWatch("测试StopWatch");stopWatch.start("任务1");// 任务1花费1000毫秒Thread.sleep(1000);stopWatch.st…

Python入门与进阶

基础语法语句 在线python代码运行网址 &#xff08;推荐使用python3网址&#xff09; 基础语法&输入输出 python等号赋值 赋值类型描述示例基本赋值使用等号&#xff08;&#xff09;进行赋值。x10同一个值给多个变量可以使用一个值来赋值给多个变量。xyz10多重赋值可以…

Bentley二次开发教程27-交互窗口-界面开发方法

界面设计概述 引言 在我们掌握了交互式工具的使用方法后&#xff0c;在使用过程中会发现&#xff1a;虽然工具中拥有多种交互的手段&#xff0c;但仅凭工具中鼠标&#xff0c;特殊按键与信息提示等交互方法&#xff0c;没有办法同时对多个信息进行展示&#xff0c;也不够直观…

Redis底层数据结构之IntSet

目录 一、概述二、IntSet结构三、自动升级 redis底层数据结构已完结&#x1f44f;&#x1f44f;&#x1f44f;&#xff1a; ☑️redis底层数据结构之SDS☑️redis底层数据结构之ziplist☑️redis底层数据结构之quicklist☑️redis底层数据结构之Dict☑️redis底层数据结构之Int…

java开发之路——用户管理中心_简单初始化

用户管理中心_简单初始化 (一) 初始化项目1. 使用 Ant Design Pro(现成的管理系统) 进行前端初始化2. 后端初始化三种初始化java项目 (二) 遇到的问题【问题1】Ant design pro页面打不开&#xff0c;一直在budiling控制台出现错误error-./src/components/index.ts【问题2】初始…

ROS python实现乌龟跟随

产生两只乌龟&#xff0c;中间的乌龟(A) 和 左下乌龟(B), B 会自动运行至A的位置&#xff0c;并且键盘控制时&#xff0c;只是控制 A 的运动&#xff0c;但是 B 可以跟随 A 运行 乌龟跟随实现的核心&#xff0c;是乌龟A和B都要发布相对世界坐标系的坐标信息&#xff0c;然后&am…

按钮获取验证码倒计时60秒

把倒计时存在缓存里刷新页面依旧是接着倒计时 <el-buttonsize"large"class"btnStyle":class"btnStyleClass":style"buttonStyle":disabled"countdownActive"click"handleClick">{{ buttonText }}</el-b…

算法-KMP算法

时间复杂度&#xff1a; public int strStr(String haystack, String needle) {int[] next new int[needle.length()];//next数组的生成next[0] 0;int prefixLen 0;//共同前后缀长度int i 1, j 1;//i,j复用while (i < needle.length()) {if (needle.charAt(prefixLen)…

Shader实战(3):贴图像素化风格实现

话不多说&#xff0c;将以下shader赋给材质贴上贴图即可。 Shader "HQY/Shader2" //自己改名 {Properties{_Diffuse ("Diffuse", Color) (1,1,1,1)_MainTex ("MainTex", 2D) "white" {}_Specular("Specular", Color) (…

AI伙伴是什么

AI伙伴&#xff0c;或称为人工智能伙伴&#xff0c;是指能够执行特定任务、协助人类活动&#xff0c;甚至进行社交互动的智能系统。 编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff09; AI伙伴通常是通过集成了先进的技术如语音识别、语义理解和图像识别等来实现与…

ubuntu扩展根目录磁盘空间

ubuntu扩展根目录磁盘空间 扩展虚拟机磁盘空间 查看现有磁盘状态 查询现有分区状态&#xff0c;/dev/sda是我们要扩展的磁盘 fdisk -l 开始进行磁盘空间的扩容 parted /dev/sda#扩展3号分区的空间 resizepart 3刷新分区空间 resize2fs /dev/sda3查询扩展结果&#xff0c;…

Golang GMP解读

概念梳理 1. 1 线程 通常语义中的线程&#xff0c;指的是内核级线程&#xff0c;核心点如下&#xff1a; 是操作系统最小调度单元&#xff1b;创建、销毁、调度交由内核完成&#xff0c;cpu 需完成用户态与内核态间的切换&#xff1b;可充分利用多核&#xff0c;实现并行. …

HTTP 网络协议请求的消息结构,具体详解(2024-04-25)

一、简介 HTTP 是基于客户端/服务端&#xff08;C/S&#xff09;的架构模型&#xff0c;通过一个可靠的链接来交换信息&#xff0c;是一个无状态的请求/响应协议。 HTTP 消息是客户端和服务器之间通信的基础&#xff0c;它们由一系列的文本行组成&#xff0c;遵循特定的格式和…

热门项目!知识付费小程序源码系统 带完整的安装代码包以及安装部署教程

近年来&#xff0c;随着在线教育、知识分享等领域的蓬勃发展&#xff0c;知识付费市场逐渐壮大。越来越多的用户愿意为高质量的知识内容付费&#xff0c;而企业和个人也看到了知识付费的巨大商机。然而&#xff0c;对于许多没有技术背景的用户来说&#xff0c;搭建一个稳定、易…

自定义数据 微调CLIP (结合paper)

CLIP 是 Contrastive Language-Image Pre-training 的缩写&#xff0c;是一个擅长理解文本和图像之间关系的模型&#xff0c;下面是一个简单的介绍&#xff1a; 优点&#xff1a; CLIP 在零样本学习方面特别强大&#xff0c;它可以&#xff08;用自然语言&#xff09;给出图像…

AI Agent新对决:LangGraph与AutoGen的技术角力

AI Agent变革未来&#xff0c;LangGraph对抗AutoGen ©作者|Blaze 来源|神州问学 引言 比尔.盖茨曾在他的博客上发表一篇文章&#xff1a;《AI is about to completely change how you use computers》。在文章中&#xff0c;比尔盖茨探讨AI Agent对我们未来生活的巨大影…