模版进阶篇章

非类型模版参数

回顾:函数模版 :不用传类型,编译器会自动推导,和普通的函数调用一样

#include<iostream>
using namespace std;
template<typename T>// T是类型
bool Less(T a, T b)// a,b是T实例化的的对象
{return a < b;
}
int main()
{cout << Less<int>(1,2) << endl;cout << Less(1, 2) << endl;return 0;
}

类模版:通过传不同的类型,编译器会自动生成不同的类,然后进行实例化对象

namespace bit
{template<typename T>// T是类型class array{array( int size = 1 ){_array = new T[size];_size = size;}bool empty(){return _size == 0;}int size(){return _size;}private:T* _array;int _size;};
}

注意:调用函数模版时,需要传对象(匿名实例化 或者 有名实例化)         

           调用类模版时,需要传类型

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int main()
{
//函数模版vector<int> s = { 1, 2, 4, 6, 7,3,1 };sort(s.begin(), s.end(), less<int>());//升序for (auto& e : s)cout << e << " ";cout << endl;sort(s.begin(), s.end(), greater<int>());//降序for (auto& e : s)cout << e << " ";cout << endl;
//类模版priority_queue<int, vector<int>, less<int>> k;// 传的是类型k.push(1);k.push(3);k.push(9);k.push(10);while (!k.empty()){cout << k.top() << " ";k.pop();}cout << endl;return 0;
}

非类型模版参数

概念:将常量作为模版参数

注意:1.只有整形家族才能支持非类型模版参数

           2.参数在编译时就能确定

#include<iostream>
#include<algorithm>
using namespace std;
namespace bit
{template<typename T ,size_t size = 10>class array//静态数组{public:array( ){_array = new T[size];_size = size;}bool empty(){return _size == 0;}int size(){return _size;}private:T* _array;int _size;};
}
int main()
{bit::array<int, 20> s;return 0;
}

模版参数可以支持缺省参数(类似于函数)

在priority_queue中我们以vector作为priority_queue的底层(参考我的另一篇文章:详细的讲解priority_queuede的用法与底层https://blog.csdn.net/wx20041102/article/details/138355281?spm=1001.2014.3001.5501)

模版特化

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错

误的结果

列如:

#include<iostream>
#include<deque>
#include<algorithm>
#include<vector>template<typename T>
class Less
{
public:bool operator() (const T& x, const T& y){return x < y;}
};template<typename T>
class Greater
{
public:bool operator() (const T& x, const T& y){return y < x;}
};class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}bool operator<(const Date& s){if (s._year > _year)return true;else if (s._year == _year){if (s._month > _month)return true;else if (s._month == _month){if (s._day > _day)return true;}}return false;}
private:int _year;int _month;int _day;
};
int main()
{Date* p1 = new Date(2024, 1, 1);Date* p2 = new Date(2024, 1, 4);Less<Date*> ls;cout << ls(p1 , p2) << endl;//这里比较的是地址大小,而我们想要比较指向的内容大小return 0;
}

解决方案:特化

  • 函数模版特化

步骤如下:

1.必须要有一个基础的函数模版

2.关键字template后接一对空的<>

3.直接在()中写出要特化的类型

4.函数形参表:必须要和模版参数的基础类型完全相同

#include<iostream>
#include<vector>
using namespace std;template<typename T>
bool Less(T& x, T& y)
{return x < y;
}template<typename T>
bool Less(int*& x, int*& y)
{return *x < *y;
}template<typename T>
bool Less(string*& x, string*& y)
{return *x < *y;
}
int main()
{int* p1 = new int(1);int* p2 = new int(3);cout << Less<int*>(p1, p2) << endl;return 0;
}

既然参数类型已经确定,那么函数模版也可以用函数重载(这是我们经常用的)

#include<iostream>
#include<vector>
using namespace std;template<typename T>
bool Less(T& x, T& y)
{return x < y;
}bool Less(int*& x, int*& y)
{return *x < *y;
}bool Less(string*& x, string*& y)
{return *x < *y;
}
int main()
{int* p1 = new int(1);int* p2 = new int(3);cout << Less<int*>(p1, p2) << endl;return 0;
}
  • 类模版特化

  • 全特化

类型全部确定

步骤如下:

1.template 后接一对<>

2.class 类型名 + < 类型 >//注意这里要将类模版中全部的参数写出来

#include<iostream>
#include<algorithm>
using namespace std;
template<typename T , typename K>
class date
{
public:date(){cout << "111111111" << endl;}
private:T _a;K _b;
};
template<>
class date<int,char>
{
public:date(){cout << "22222222222" << endl;}
private:int _a;char _b;
};int main()
{date<int, char> s;date<char, char> k;date<int, int> q;
}
  • 偏特化
部分特化

1.template< 需要实例化的类型 >//template<typename T>

2.class <需要实例化的类型 + 缺省类型 >// class < T , char >

#include<iostream>
#include<algorithm>
using namespace std;
template<typename T , typename K>
class date
{
public:date(){cout << "111111111" << endl;}
private:T _a;K _b;
};
template<>
class date<int,char>
{
public:date(){cout << "22222222222" << endl;}
private:int _a;char _b;
};
template<typename T >
class date< T , char >
{
public:date(){cout << "3333333333" << endl;}
private:T _a;char _b;
};
int main()
{date<int, char> s;date<char, char> k;date<int, int> q;
}
限制特化

以某个性质限制,列如指针 ,引用

#include<iostream>
#include<deque>
#include<algorithm>
#include<vector>template<typename T>
class Less
{
public:bool operator() (const T& x, const T& y){return x < y;}
};
template<typename T>
class Less<T*>// 限制特化 只有指针才能进入这里
{
public:bool operator()( T* x, T* y){return *x < *y;}
};template<typename T>
class Less<T&>// 限制特化 只有引用才能进入这里
{
public:bool operator()( T& x, T& y){return x < y;}
};template<typename T>
class Greater
{
public:bool operator() (const T& x, const T& y){return y < x;}
};class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}bool operator<(const Date& s){if (s._year > _year)return true;else if (s._year == _year){if (s._month > _month)return true;else if (s._month == _month){if (s._day > _day)return true;}}return false;}
private:int _year;int _month;int _day;
};
int main()
{Date* p1 = new Date(2024, 1, 1);Date* p2 = new Date(2024, 1, 4);Less<Date*> ls;cout << ls(p1 , p2) << endl;return 0;
}

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

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

相关文章

微信小程序开发:深入实现地图导航功能【含代码示例】

微信小程序开发&#xff1a;深入实现地图导航功能【含代码示例】 一、引言二、准备工作三、集成地图SDK四、实现地图显示五、添加标记点和路线 一、引言 微信小程序作为一种轻量级的应用程序&#xff0c;凭借其无需安装、即用即走的特点&#xff0c;迅速在移动应用市场中占据了…

笔试狂刷--Day12(模拟 + 链表的公共节点 + dp)

大家好,我是LvZi,今天带来笔试狂刷--Day12(模拟 链表的公共节点 dp) 一.删除公共字符&#xff08;哈希&#xff09; 题目链接:删除公共字符&#xff08;哈希&#xff09; 分析: 分别读取俩个字符串,将第二个字符串存储到set之中,再遍历第一个字符串,删除公共字符 代码: …

StringUtils中isBlank()和isEmpty()的区别

1.首先导入依赖common-lang3 <!--string的扩展api--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version> <!-- 请使用最新版本 --></dependency&g…

《网络安全技术 网络安全众测服务要求》

近日&#xff0c;全国网络安全标准化技术委员会发布《网络安全技术 网络安全众测服务要求》&#xff08;GB/T 43741-2024&#xff0c;以下简称“众测服务要求”&#xff09;&#xff0c;并将在2024年11月1日正式实施。 《众测服务要求》确立了网络安全众测服务的角色及其职责&…

ruoyi漏洞总结

若依识别 黑若依 :icon hash"-1231872293 绿若依 :icon hash"706913071” body" 请通过前端地址访 " body" 认证失败&#xff0c;无法访问系统资源 " 如果页面访问显示不正常&#xff0c;可添加默认访问路径尝试是否显示正常 /login?redi…

Dashboard 介绍

Dashboard 介绍 一、K8S Dashboard简介 简单的说&#xff0c;K8S Dashboard是官方的一个基于WEB的用户界面&#xff0c;专门用来管理K8S集群&#xff0c;并可展示集群的状态。K8S集群安装好后默认没有包含Dashboard&#xff0c;我们需要额外创建它 二、RABC简介 还是那句话&a…

MLP手写数字识别(1)-MNIST数据集下载与可视化(tensorflow)

1.下载与查看MNIST数据集 from keras.datasets import mnist(x_train_image,y_train_label),(x_test_image,y_test_label) mnist.load_data() print("train images:",x_train_image.shape) print("test images:",x_test_image.shape) print("train …

LeetCode 面试经典150题 28.找出字符串中第一个匹配项的下标

题目&#xff1a;给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 思路&#xff1a;暴力&#xff08;…

RabbitMQ知识点总结和复习

之前项目中用到RabbitMQ的场景主要是订单信息的传递&#xff0c;还有就是利用RabbitMQ的死信队列属性设置&#xff0c;实现延迟队列效果&#xff0c;实现超时支付取消功能&#xff0c;以及在两个不同项目中传递数据等场景。 最近几年的工作中都是一直用的RabbitMQ&#xff0c;…

Springboot+MybatisPlus入门案例(postman测试)

一、项目框架 pom.xml依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apac…

基于php+mysql+html图书管理系统(含实训报告)

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、Php、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

任何内核都无法启动解决方案

背景 实验中不停编译新的内核又懒得删除了&#xff0c;于是乎在编译到第9716个内核后&#xff0c;无法启动了。 报错如下&#xff1a; 主要是这句报错&#xff1a; 解决方案 ubuntu linux开机进入不了系统的解决办法 进入Recovery Mode打开root shell失败&#xff1a; 一…

【数据结构】您有一份KMP算法教学已到账,请注意查收!!!

KMP算法 导读一、KMP算法1.1 重要术语1.2 部分匹配值1.3 部分匹配值的作用 二、KMP算法原理2.1 从指针的角度理解KMP算法2.2 从匹配的角度理解KMP算法2.3 小结 三、KMP算法的实现3.1 next数组3.2 next数组的计算3.2.1 通过PM值计算next数组3.2.2 通过移位模拟计算next数组3.2.3…

Python的类和assert断言

Python中的**类(Class)**是一个抽象的概念&#xff0c;比函数还要抽象&#xff0c;这也就是Python的核心概念&#xff0c;面对对象的编程方法(OOP)&#xff0c;其它如:Java、C等都是面对对象的编程语言。 面对对象(oop)中的对象&#xff0c;是一个非常重要的知识点&#xff0c;…

基于Spring Boot的音乐网站与分享平台设计与实现

基于Spring Boot的音乐网站与分享平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看首…

acwing算法提高之数学知识--高斯消元

目录 1 介绍2 训练 1 介绍 本专题用来记录高斯消元相关题目。 2 训练 题目1&#xff1a;207球形空间产生器 C代码如下&#xff0c; #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath>using…

【软件工程】详细设计

目录 前言详细设计算法设计工具——判定表 前言 软件工程生命周期分为八个阶段&#xff1a; 问题定义—>可行性研究—>需求分析 —>概要设计—>详细设计—>编码与单元测试 —>综合测试—>软件维护 这节我们讲的是软件开发流程中的一个阶段&#xff0c;需求…

2024-05-03 问AI: 在深度学习中,什么叫文字嵌入层

文心一言 在深度学习中&#xff0c;文字嵌入层&#xff08;Word Embedding Layer&#xff09;是神经网络的一个部分&#xff0c;主要用于将离散的文本数据&#xff08;如单词、句子等&#xff09;转换为连续的低维向量表示。这种转换有助于神经网络更好地理解和处理文本数据&a…

✔ ★Java大项目——用Java模拟RabbitMQ实现一个消息队列(二)【创建核心类、封装数据库操作】

✔ ★Java大项目——用Java模拟RabbitMQ实现一个消息队列 四. 项⽬创建五. 创建核⼼类 ★创建 Exchange&#xff08;名字、类型、持久化、自动删除、参数&#xff09;创建 MSGQueue&#xff08;名字、持久化、独占标识&#xff09;创建 Binding&#xff08;交换机名字、队列名字…

OpenCV(四)—— 车牌号识别

本节是车牌识别的最后一部分 —— 车牌字符识别&#xff0c;从一个完整的车牌图片到识别出车牌上的字符大致需要如下几步&#xff1a; 预处理&#xff1a;将车牌图片灰度化、二值化&#xff0c;并去除识别时的干扰因素&#xff0c;比如车牌铆钉字符分割&#xff1a;将整个车牌…