当前位置: 首页 > 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” “…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...