当前位置: 首页 > news >正文

c++类模板,嵌套类模板,模板链表,动态数组

c++类模板,嵌套类模板,模板链表,动态数组

一.类模板

1.类模板的书写

代码如下

template<typename T>//模板
class CTest {//类
public:T m_a;CTest(const T&a):m_a(a){}void fun1() {cout << typeid(m_a).name() << "   " << m_a << endl;}
};int main() {//进行调用测试CTest<int> tes(5);//在定义对象时 显示指定tes.fun1();CTest2<> tes2(5);//用类模板定义对象时<> 不能省略tes2.fun1();return 0;
}

2.类模板的顺序要求

指定默认的类型有顺序要求,从右到左一次指定,中间不得有间断

代码如下

template<typename T=int, typename K=char>//正确的写法

3.当类模板中有函数模板时,在外面进行函数实现

在类模板里定义了使用了函数模板的函数

在类模板外进行实现没使用函数模板的函数的时候

只写类模板就可以

代码如下

template<typename T=int>
class CTest {
public:T m_a;CTest(const T& a) :m_a(a) {}void fun1();template<typename K=char>void fun2(K k);
};template<typename T>
void CTest<T>::fun1() {cout << typeid(m_a).name() << "   " << m_a << endl;
}

在类模板外进行实现使用了函数模板的函数的时候

要先类模板,后函数模板,顺序不能反

代码如下

template<typename T=int>
class CTest {
public:T m_a;CTest(const T& a) :m_a(a) {}void fun1();template<typename K=char>void fun2(K k);
};template<typename T>//类模板
template<typename K>//函数模板
void CTest<T>::fun2(K k) {cout << typeid(m_a).name() << "   " << m_a << endl;cout << typeid(k).name() << "   " << k << endl;
}

二.嵌套类模板

看如下代码进行分析

#include <iostream>
using namespace std;template<typename T>
class A {
public:T m_a;A(const T&a):m_a(a){}};class B {
public:A<int> aa;B():aa(1) {//调用了A的构造函数}
};template<typename K>
class C {
public:A<K> aa;C(const A<K>& a):aa(a){}//调用了A的拷贝函数
};template<typename M>
class D {
public:M m_m;D(const M& m) :m_m(m) {}//调用了A的拷贝函数
};int main() {B tes;cout << typeid(tes.aa.m_a).name() << "   "<< tes.aa.m_a <<endl;C<char> cc(A<char>('a'));cout << typeid(cc.aa.m_a).name() << "   " << cc.aa.m_a << endl;D<  A<char> > dd(A<char>('a'));cout << typeid(dd.m_m.m_a).name() << "   " << dd.m_m.m_a << endl;return 0;
}

三.模板链表

将一个链表变为模板链表

原链表

#include <iostream>
using namespace std;//节点
struct Node {int m_v;Node* m_pNext;Node(int v) {m_v = v;m_pNext = nullptr;}
};//迭代器
class Citerator {
public:Node* Temp;Citerator(Node* m_pHead) :Temp(m_pHead) {}bool operator!=(Node* m_pHead) {return Temp != m_pHead;}operator bool() {return Temp;}int operator*() {return Temp->m_v;}Node* operator++() {Temp=Temp->m_pNext;return Temp;}Node* operator++(int) {Node* temp = Temp;Temp = Temp->m_pNext;return temp;}};//链表
class Clist {
public:Node* m_pHead;Node* m_pEnd;int m_nLen;
public:void showClist() {Citerator ite(m_pHead);//构造while (ite!=nullptr) { //operator!=  operator==  operator boolcout << *ite << "    ";//operator*ite++;//operator++}cout << endl;}Clist() {m_pHead = m_pEnd = nullptr;m_nLen = 0;}~Clist() {Node* pTemp = nullptr;while (m_pHead) {pTemp = m_pHead;m_pHead = m_pHead->m_pNext;delete pTemp;pTemp = m_pHead = m_pEnd = nullptr;m_nLen = 0;}}void pushBack(int v) {Node* p_Node = new Node(v);if (m_pHead) {m_pEnd->m_pNext = p_Node;m_pEnd = p_Node;}else {m_pHead = m_pEnd = p_Node;}++m_nLen;}void clearFront() {if (m_pHead) {Node* Temp = m_pHead;if (m_nLen == 1) {m_pHead = m_pEnd = nullptr;}else {m_pHead = m_pHead->m_pNext;}delete Temp;Temp = nullptr;--m_nLen;}}int Clistlen() {return m_nLen;}
};int main() {Clist pro;pro.pushBack(1);pro.pushBack(2);pro.pushBack(3);pro.pushBack(4);pro.pushBack(5);pro.showClist();cout << pro.m_nLen << endl;pro.clearFront();pro.clearFront();pro.clearFront();pro.clearFront();pro.showClist();cout << pro.m_nLen << endl;return 0;
}

更改后的链表

#include <iostream>
using namespace std;//节点
template<typename T>//1
struct Node {T m_v; //2Node* m_pNext;Node(const T& v):m_v (v), m_pNext(nullptr){//3}
};//迭代器
template<typename M>//4
class Citerator {
public:Node<M>* Temp;//5Citerator(Node<M>* m_pHead) :Temp(m_pHead) {}//6bool operator!=(Node<M>* m_pHead) {//7return Temp != m_pHead;}operator bool() {return Temp;}M& operator*() {//8 返回类型为引用,返回的就是当前类对象的变量return Temp->m_v;}Node<M>* operator++() {//9Temp=Temp->m_pNext;return Temp;}Node<M>* operator++(int) {//10Node<M>* temp = Temp;//11Temp = Temp->m_pNext;return temp;}};//链表
template<typename K>//12
class Clist {
public:Node<K>* m_pHead;//13Node<K>* m_pEnd;//14int m_nLen;
public:void showClist() {Citerator<K> ite(m_pHead);//构造while (ite!=nullptr) { //operator!=  operator==  operator boolcout << *ite << "    ";//operator*ite++;//operator++}cout << endl;}Clist() {m_pHead = m_pEnd = nullptr;m_nLen = 0;}~Clist() {Node<K>* pTemp = nullptr;//15while (m_pHead) {pTemp = m_pHead;m_pHead = m_pHead->m_pNext;delete pTemp;pTemp = m_pHead = m_pEnd = nullptr;m_nLen = 0;}}void pushBack(K v) {//16Node<K>* p_Node = new Node<K>(v);//17if (m_pHead) {m_pEnd->m_pNext = p_Node;m_pEnd = p_Node;}else {m_pHead = m_pEnd = p_Node;}++m_nLen;}void clearFront() {if (m_pHead) {Node<K>* Temp = m_pHead;//18if (m_nLen == 1) {m_pHead = m_pEnd = nullptr;}else {m_pHead = m_pHead->m_pNext;}delete Temp;Temp = nullptr;--m_nLen;}}int Clistlen() {return m_nLen;}
};//自定义类型
class CTest {
public:int m_a;CTest():m_a(10){}CTest(int a):m_a(a) {}
};ostream& operator<<(ostream& os, CTest& tst) {os << tst.m_a;return os;
}
int main() {//样例测试//Clist<double> pro;//pro.pushBack(1.1);//pro.pushBack(2.1);//pro.pushBack(3.1);//pro.pushBack(4.1);//pro.pushBack(5.1);//pro.showClist();//cout << pro.m_nLen << endl;//pro.clearFront();//pro.clearFront();//pro.clearFront();//pro.clearFront();//pro.showClist();//cout << pro.m_nLen << endl;//自定义类型的测试Clist<CTest> pro;pro.pushBack(CTest());pro.pushBack(CTest());pro.pushBack(CTest());pro.pushBack(CTest(5));pro.pushBack(CTest(57));pro.showClist();cout << pro.m_nLen << endl;pro.clearFront();pro.clearFront();pro.clearFront();pro.clearFront();pro.showClist();cout << pro.m_nLen << endl;return 0;
}

四.动态数组

动态数组:

1.用模板使该数组变为通用类型(可以存任意一种类型的数据)

2.当数组大小不够时,以1.5倍扩容

代码如下

#include <iostream>
using namespace std;/*动态数组:可以存任意一种类型数据所以要用到模板当数组大小不够时,以1.5倍扩容
*/template<typename T>
class CDynamicArray {
public:T * array;int m_size;  //使用量int m_rongliang;  //容量
public:CDynamicArray(int rongliang=0):array(nullptr), m_size(0), m_rongliang(0){//动态数组的初始化if (rongliang > 0) {array = new T[rongliang];m_size = 0;m_rongliang = rongliang;}}~CDynamicArray() {//最后结束回收空间if (array) {delete[]array;}m_size = 0;m_rongliang = 0;}
public:void PushBack(const T& t) {if (m_size >= m_rongliang) {//容量不够,进行扩容int Temp = m_rongliang + 1;m_rongliang = (m_rongliang + m_rongliang / 2)> Temp? (m_rongliang + m_rongliang / 2): Temp;T* Newarray = new T[m_rongliang];for (int i = 0; i < m_size; i++) {Newarray[i] = array[i];}delete[]array; array = Newarray;}array[m_size++] = t;}void PopBack() {//删除动态数组尾部元素if (m_size) m_size -= 1;}void ShowArray() {//遍历一遍动态数组元素for (int i = 0; i < m_size; i++) {cout << array[i] << "   ";}cout << endl;}int GetLength() {//获取动态数组的长度(使用量)return m_size;}T& operator[](int index) {//重载[],可以直接通过类对象名[]的方式获得元素的值return array[index];}T* begin() {//手写begin()函数,和end()函数,这样就可以使用for的范围遍历了return &array[0];}T* end() {return &array[m_size];}};int main() {//样例测试CDynamicArray<int> arr;arr.PushBack(1);arr.PushBack(2);arr.PushBack(3);arr.PushBack(4);arr.PushBack(5);arr.ShowArray();cout << arr.GetLength() << endl;arr.PopBack();arr.PopBack();arr.ShowArray();cout << arr[0] << endl;for (int i = 0; i < arr.GetLength(); i++) {cout << arr[i] << "   ";}cout << endl;for (int v : arr) {cout << v << "   " ;}cout << endl;return 0;
}

相关文章:

c++类模板,嵌套类模板,模板链表,动态数组

c类模板&#xff0c;嵌套类模板&#xff0c;模板链表&#xff0c;动态数组 一.类模板 1.类模板的书写 代码如下 template<typename T>//模板 class CTest {//类 public:T m_a;CTest(const T&a):m_a(a){}void fun1() {cout << typeid(m_a).name() << …...

【Flutter】【基础】CustomPaint 绘画功能,绘制各种图形(二)

CustomPaint 使用实例和代码&#xff1a; 1.canvas.drawColor 绘制背景颜色 class MyPainter1 extends CustomPainter {overridevoid paint(Canvas canvas, Size size) {//绘制背景颜色&#xff0c;整个UI 现在就是红色的canvas.drawColor(Colors.red, BlendMode.srcATop);}…...

YOLOv5修改注意力机制CBAM

直接上干货 CBAM注意力机制是由通道注意力机制&#xff08;channel&#xff09;和空间注意力机制&#xff08;spatial&#xff09;组成。 传统基于卷积神经网络的注意力机制更多的是关注对通道域的分析&#xff0c;局限于考虑特征图通道之间的作用关系。CBAM从 channel 和 sp…...

计算机网络 网络层 概述

...

算法练习--动态规划 相关

文章目录 走方格的方案 走方格的方案 请计算n*m的棋盘格子&#xff08;n为横向的格子数&#xff0c;m为竖向的格子数&#xff09;从棋盘左上角出发沿着边缘线从左上角走到右下角&#xff0c;总共有多少种走法&#xff0c;要求不能走回头路&#xff0c;即&#xff1a;只能往右和…...

JAVA volatile 关键字

volatile 是JAVA虚拟机提供的轻量级的同步机制&#xff0c;有三大特性 1、保证可见性 2、不保证原子性 3、禁止指令重排 JMM JAVA内存模型本身是一种抽象的概念并不真实存在 它描述的是一组规则或规范&#xff0c;提供这组规范定义了程序中各个变量&#xff08;包括实例变…...

[Leetcode] [Tutorial] 回溯

文章目录 46. 全排列Solution 78. 子集Solution 17. 电话号码的字母组合Solution 39. 组合总和Solution 22. 括号生成Solution 46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例&#xff1a; 输入&…...

STM32 CubeMX USB_MSC(存储设备U盘)

STM32 CubeMX STM32 CubeMX USB_MSC(存储设备U盘&#xff09; STM32 CubeMX前言 《使用内部Flash》——U盘一、STM32 CubeMX 设置USB时钟设置USB使能UBS功能选择FATFS功能 二、代码部分修改代码"usbd_storage_if.c"修改代码"user_diskio.c"main函数初始化插…...

湘大 XTU OJ 1214 A+B IV 题解:数位移动的本质+布尔变量标记+朴素模拟

一、链接 AB IV 二、题目 题目描述 小明喜欢做ab的算术&#xff0c;但是他经常忘记把末位对齐&#xff0c;再进行加&#xff0c;所以&#xff0c;经常会算错。 比如1213&#xff0c;他把12左移了1位&#xff0c;结果变成了133。 小明已经算了一些等式&#xff0c;请计算一下…...

以商业大数据技术助力数据合规流通体系建立,合合信息参编《数据经纪从业人员评价规范》团标

经国务院批准&#xff0c;由北京市人民政府、国家发展和改革委员会、工业和信息化部、商务部、国家互联网信息办公室、中国科学技术协会共同主办的2023 全球数字经济大会于近期隆重召开。由数交数据经纪&#xff08;深圳&#xff09;有限公司为主要发起单位&#xff0c;合合信息…...

【论文阅读】Deep Instance Segmentation With Automotive Radar Detection Points

基于汽车雷达检测点的深度实例分割 一个区别&#xff1a; automotive radar 汽车雷达 &#xff1a; 分辨率低&#xff0c;点云稀疏&#xff0c;语义上模糊&#xff0c;不适合直接使用用于密集LiDAR点开发的方法 &#xff1b; 返回的物体图像不如LIDAR精确&#xff0c;可以…...

易服客工作室:如何创建有用的内容日历

利用技巧和工具优化您的内容营销效率和效果。创建一个内容日历&#xff0c;您的整个团队都会从中受益&#xff01; 欢迎来到熙熙攘攘、瞬息万变的内容营销世界&#xff0c;在这里&#xff0c;截止日期到来的速度比喝咖啡的猎豹还要快。 现在&#xff0c;想象一下在没有地图、…...

Excel革命,基于电子表格开发的新工具,不是Access和Power Fx

深谙其道 在日常工作中&#xff0c;Excel是许多人不可或缺的办公工具。 是微软的旗下产品&#xff0c;属于Microsoft 365套件中的一部分&#xff0c;强大的数据处理和计算功能&#xff0c;被普遍应用在全球各行各业的人群当中&#xff0c;是一款强大且普及的电子表格软件。 于…...

“崩溃”漏洞会影响英特尔 CPU 的使用寿命,可能会泄露加密密钥等

对于 CPU 安全漏洞来说&#xff0c;本周是重要的一周。昨天&#xff0c;不同的安全研究人员发布了两个不同漏洞的详细信息&#xff0c;一个影响多代英特尔处理器&#xff0c;另一个影响最新的 AMD CPU。“ Downfall ”和“ Inception ”&#xff08;分别&#xff09;是不同的错…...

17.电话号码的字母组合(回溯)

目录 一、题目 二、代码 一、题目 17. 电话号码的字母组合 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution {const char*data[10]{"","","abc","def","ghi","jkl","mno","pq…...

Redis小例子

MAC电脑下Redis的安装&#xff1a; brew install redis下面给一个Java操作redis的小例子 import redis.clients.jedis.Jedis;public class Demo {public static void main(String[] args) {// 创建 Jedis 客户端实例&#xff0c;连接到本地 Redis 服务器&#xff0c;默认端口…...

ETLCloud+MaxCompute实现云数据仓库的高效实时同步

MaxCompute介绍 MaxCompute是适用于数据分析场景的企业级SaaS&#xff08;Software as a Service&#xff09;模式云数据仓库&#xff0c;以Serverless架构提供快速、全托管的在线数据仓库服务&#xff0c;消除了传统数据平台在资源扩展性和弹性方面的限制&#xff0c;最小化用…...

HTTP代理授权方式介绍

在网络爬虫过程中&#xff0c;我们经常需要使用HTTP代理来实现IP隐藏、突破限制或提高抓取效率。而为了确保代理的正常使用&#xff0c;并避免被滥用&#xff0c;代理服务商通常会采用授权方式。在本文中&#xff0c;我们将介绍几种常见的HTTP代理授权方式&#xff0c;以帮助你…...

《合成孔径雷达成像算法与实现》Figure3.4

代码对补零信号与未补零信号都进行了实现&#xff0c;补零信号更加贴近书中图3.4的样子&#xff1a; clc clear all close all%参数设置 TBP 100; %时间带宽积 T 10e-6; %脉冲持续时间 alpha_os [1.4,1.2,1.0,0…...

qt5.15.2 使用mysql8.1

报错&#xff1a; QMYSQL driver not loaded 报错&#xff1a;无 QMYSQL 使用 QStringList drivers QSqlDatabase::drivers(); //获取现在可用的数据库驱动 foreach(QString driver, drivers) qDebug() << driver; “QSQLITE” “QMARIADB” “QMYSQL” “QMYSQL3” “…...

还在为充气泵电压波动导致MCU复位发愁吗?CSM53系列拥有40V宽压输入配合优秀的瞬态响应,轻松抵御电机启停浪涌,配合2.5μA微功耗,让你的便携充气泵续航提升30%!

CSM53系列LDO在充气泵中的详细应用分析一、先搞懂核心&#xff1a;CSM53系列LDO的关键特性&#xff08;适配充气泵的核心优势&#xff09;在分析应用前&#xff0c;先明确这款芯片的核心参数&#xff0c;这是适配充气泵场景的基础&#xff1a;* 二、充气泵的系统架构与LDO的定位…...

Cursor功能解锁与开发效率提升技术指南

Cursor功能解锁与开发效率提升技术指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial request limit. / Too m…...

打字不如说话,说话不如截图——AI 代码助手的多模态输入实践不

整体排查思路 我们的目标是验证以下三个环节是否正常&#xff1a; 登录成功时&#xff1a;服务器是否正确生成了Session并返回了包含正确 JSESSIONID的Cookie给浏览器。 浏览器端&#xff1a;浏览器是否成功接收并存储了该Cookie。 后续请求&#xff1a;浏览器在执行查询等操作…...

如何快速安装Hollow Knight模组:Scarab模组管理器的完整指南

如何快速安装Hollow Knight模组&#xff1a;Scarab模组管理器的完整指南 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 厌倦了手动下载和安装Hollow Knight模组的繁琐过程&am…...

Meta推出由高薪超级智能实验室研发的全新AI模型

Meta于本周三正式发布了其最新人工智能模型&#xff0c;这也是该公司组建一支高薪团队以在AI赛道上与竞争对手展开较量后推出的首个重磅成果。这款名为Muse Spark的新模型由Meta超级智能实验室打造。该实验室汇聚了一批来自各大AI公司的顶尖人才&#xff0c;于去年正式成立&…...

Spring WebFlux vs 虚拟线程:同一微服务压测对比(RPS 22,400 vs 38,900),为什么你该立刻停用响应式编程?

第一章&#xff1a;Java 25虚拟线程演进全景与高并发架构新范式Java 25正式将虚拟线程&#xff08;Virtual Threads&#xff09;从预览特性转为标准特性&#xff0c;并深度整合至java.util.concurrent、java.net和java.io等核心模块&#xff0c;标志着JVM并发模型从“OS线程绑定…...

【PHP异步I/O配置终极指南】:20年SRE亲授EventLoop选型、Swoole协程适配与ReactPHP性能调优(附压测对比数据)

第一章&#xff1a;PHP异步I/O配置全景认知与演进脉络PHP的异步I/O能力并非原生内置&#xff0c;而是伴随SAPI模型演进、扩展生态成熟及现代协程范式兴起逐步构建的。从早期通过多进程&#xff08;pcntl_fork&#xff09;或轮询&#xff08;stream_select&#xff09;模拟非阻塞…...

Maomi.In | .NET 全能多语言解决方案八

AI Agent 时代的沙箱需求 从 Copilot 到 Agent&#xff1a;执行能力的质变 在生成式 AI 的早期阶段&#xff0c;应用主要以“Copilot”形式存在&#xff0c;AI 仅作为辅助生成建议。然而&#xff0c;随着 AutoGPT、BabyAGI 以及 OpenAI Code Interpreter&#xff08;现为 Advan…...

Calico IPIP 使用指南延

本课概览 Microsoft Agent Framework (MAF) 提供了一套强大的 Workflow&#xff08;工作流&#xff09; 框架&#xff0c;用于编排和协调多个智能体&#xff08;Agent&#xff09;或处理组件的执行流程。 本课将以通俗易懂的方式&#xff0c;帮助你理解 MAF Workflow 的核心概念…...

LAYONTHEGROUND筛

一、什么是requests&#xff1f; requests 是一个用于发送HTTP请求的 Python 库。 它可以帮助你&#xff1a; 轻松发送GET、POST、PUT、DELETE等请求 处理Cookie、会话等复杂性 自动解压缩内容 处理国际化域名和URL 二、应用场景 requests 广泛应用于以下实际场景&#xff1a; …...