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” “…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
