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类模板,嵌套类模板,模板链表,动态数组 一.类模板 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 使用实例和代码: 1.canvas.drawColor 绘制背景颜色 class MyPainter1 extends CustomPainter {overridevoid paint(Canvas canvas, Size size) {//绘制背景颜色,整个UI 现在就是红色的canvas.drawColor(Colors.red, BlendMode.srcATop);}…...

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

计算机网络 网络层 概述
...
算法练习--动态规划 相关
文章目录 走方格的方案 走方格的方案 请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和…...
JAVA volatile 关键字
volatile 是JAVA虚拟机提供的轻量级的同步机制,有三大特性 1、保证可见性 2、不保证原子性 3、禁止指令重排 JMM JAVA内存模型本身是一种抽象的概念并不真实存在 它描述的是一组规则或规范,提供这组规范定义了程序中各个变量(包括实例变…...

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

STM32 CubeMX USB_MSC(存储设备U盘)
STM32 CubeMX STM32 CubeMX USB_MSC(存储设备U盘) 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的算术,但是他经常忘记把末位对齐,再进行加,所以,经常会算错。 比如1213,他把12左移了1位,结果变成了133。 小明已经算了一些等式,请计算一下…...

以商业大数据技术助力数据合规流通体系建立,合合信息参编《数据经纪从业人员评价规范》团标
经国务院批准,由北京市人民政府、国家发展和改革委员会、工业和信息化部、商务部、国家互联网信息办公室、中国科学技术协会共同主办的2023 全球数字经济大会于近期隆重召开。由数交数据经纪(深圳)有限公司为主要发起单位,合合信息…...

【论文阅读】Deep Instance Segmentation With Automotive Radar Detection Points
基于汽车雷达检测点的深度实例分割 一个区别: automotive radar 汽车雷达 : 分辨率低,点云稀疏,语义上模糊,不适合直接使用用于密集LiDAR点开发的方法 ; 返回的物体图像不如LIDAR精确,可以…...

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

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

“崩溃”漏洞会影响英特尔 CPU 的使用寿命,可能会泄露加密密钥等
对于 CPU 安全漏洞来说,本周是重要的一周。昨天,不同的安全研究人员发布了两个不同漏洞的详细信息,一个影响多代英特尔处理器,另一个影响最新的 AMD CPU。“ Downfall ”和“ Inception ”(分别)是不同的错…...

17.电话号码的字母组合(回溯)
目录 一、题目 二、代码 一、题目 17. 电话号码的字母组合 - 力扣(LeetCode) 二、代码 class Solution {const char*data[10]{"","","abc","def","ghi","jkl","mno","pq…...
Redis小例子
MAC电脑下Redis的安装: brew install redis下面给一个Java操作redis的小例子 import redis.clients.jedis.Jedis;public class Demo {public static void main(String[] args) {// 创建 Jedis 客户端实例,连接到本地 Redis 服务器,默认端口…...

ETLCloud+MaxCompute实现云数据仓库的高效实时同步
MaxCompute介绍 MaxCompute是适用于数据分析场景的企业级SaaS(Software as a Service)模式云数据仓库,以Serverless架构提供快速、全托管的在线数据仓库服务,消除了传统数据平台在资源扩展性和弹性方面的限制,最小化用…...

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

《合成孔径雷达成像算法与实现》Figure3.4
代码对补零信号与未补零信号都进行了实现,补零信号更加贴近书中图3.4的样子: clc clear all close all%参数设置 TBP 100; %时间带宽积 T 10e-6; %脉冲持续时间 alpha_os [1.4,1.2,1.0,0…...

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

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...