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

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

Windows 下端口占用排查与释放全攻略

Windows 下端口占用排查与释放全攻略​ 在开发和运维过程中&#xff0c;经常会遇到端口被占用的问题&#xff08;如 8080、3306 等常用端口&#xff09;。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口&#xff0c;帮助你高效解决此类问题。​ 一、准…...