template 的用法

关于template标签用法总结(含vue中的用法总结) 文章目录html5中的template标签template标签操作的属性和方法vue中的template html5中的template标签 html中的template标签中的内容在页面中不会显示。但是在后台查看页面DOM结构存在template标签。这是因为template标签天生不可见,它设置了display:none;属性。 <!--当前页面只显示"我是自定义表现abc"这个内容,不... 阅读详情
 

正在看C++primer里的template的用法,偏巧逛CSDN的时候又看到一张帖子讲得很详细,就转过来,留着以后温习用。

--  template 的用法
在程序设计当中经常会出现使用同种数据结构的不同实例的情况。例如:在一个程序中
可以使用多个队列、树、图等结构来组织数据。同种结构的不同实例,也许只在数据元素
的类型或数量上略有差异,如果对每个实例都重新定义,则非常麻烦且容易出错。那么能
否对同种类型数据结构仅定义一次呢?答案是肯定的,C++提供的类模板(Class Template
)就可以实现该功能。
一、类模板
类模板是C++提供的一种特殊机制,通过它我们可以定义一种特殊的类(称为模板类),在类
的定义中可以包含待定的类型参数,在声明类的实例时,系统会自动根据传递的类型生成
用户想要生成的类实例。下面是用C++实现的一个简单的模板类Clist的定义。
Template <class T, int I> class CList
{
public:
int SetItem(int Index, const T &Item);
int GetItem(int Index, T &Item);
private:
T Buffer;
}
在这里,T是类型参数,I是整型常量参数。T和I的实际值是在声明具体类实例时指定的。
模板类的<>号内可以包括任意个类型参数和常量参数(至少要有一个参数)。类型参数和
常量参数可以是任何合法的标准类型和用户自定义类型,包括简单类型及各种结构体。同
其他类一样,类成员函数SetItem的实现可以在类定义内完成,也可以在类CList定义处实
现:
template<class T, int I> int CList<T, I>::SetItem(int Index, const T &Item)
{
if ( (Index<0)||(Index>I-1) )
 return 0; // 出错
Buffer[Index]= Item ;
 return 1; // 成功
}
值得注意的是,在类定义外完成函数实现时,必须以关键字template和类模板定义中相同
的参数表(<>号内的)开头(上例为template<class T, int I>),并且范围分解操作符前的
类名后应跟上模板参数名清单(上例为CList<T, I>)。另外,与非模板类不同的是,必须将
函数实现包括在调用它的每个源文件中,使编译器能从函数实现产生代码。通常的做法是
将模板类的函数实现也放在定义该类的头文件中,这样只需在调用的源文件中包含该头文
件即可。
那么,如何使用生成特定的类实例呢?我们可以像使用其他类一样来使用模板类,不过必须
指定模板参数的值。例如采用如下声明:
CList <int, 100> IntList;
则使IntList成为CList类的实例,每次出现的T参数都换成int, 每次出现的I参数都换成
100。这样,IntList类中的Buffer就是一个长度为100的整型数组,SetItem和GetItem函数
参数是int值的引用。例:
IntList.SetItem(0, 5); //给数组第一个元素赋为整数5
模板类还可以像其他类一样可以定义构造函数和析构函数。下面我们以一种简单的数据
结构——堆栈为例,来说明如何用类模板来构造通用数据结构。
二、 利用类模板实现通用堆栈结构
任何抽象数据结构在计算机中的实现,归根结底都只有两种方式:顺序存储(用数组实现)
,链式存储(用指针实现)。堆栈也不例外,按其实现方式可分为顺序栈(用数组实现)和链
栈(用指针实现)。
1. 通用顺序栈的实现
因为顺序栈中的元素在空间上连续存储,栈顶的元素位置需要注明,所以构造顺序栈的模
板类应该有这样的一些成员变量:一个待定类型和长度的数组Buffer,一个记录栈顶元素
的数组下标的整型变量top。堆栈的基本操作主要有:入栈(Push)、出栈(Pop)、置空(Se
tEmpty)、判断当前状态(IsEmpty)等,它们应用模板类的成员函数来实现。作为一个标准
的类,它还应该有自己的构造函数和析构函数。具有这些功能的模板类,就可以作为一个
通用的顺序栈来使用了。该类的定义如下:
template <class T,int SIZE> class CArrayStackTemp
{
public:
CArrayStackTemp () //缺省构造函数,构造一个空堆栈
{
top= -1;
};
~ CArrayStackTemp (){};//析构函数
 void SetEmpty (); //置空堆栈
 bool IsEmpty(); //判断堆栈是否为空
 bool Push(T element); //入栈
 bool Pop(T& element);//出栈
private:
T Buffer[SIZE];
 int top;
};
与堆栈的基本操作相对应的成员函数的实现如下:
template <class T, int SIZE> void CArrayStackTemp<T, SIZE>:: SetEmpty ()
{
top= -1; //将栈顶指针赋 -1,并不实际清除数组元素
}
template <class T, int SIZE> bool CArrayStackTemp<T, SIZE>:: IsEmpty ()
{
return(top == -1);
}
template <class T, int SIZE> bool CArrayStackTemp<T, SIZE>:: Push (T element
)
{
top++;
if (top>SIZE-1)
{
top--;
return false; //堆栈已满,不能执行入栈操作
}
Buffer[top]=element;
return true;
}
template <class T, int SIZE> void CArrayStackTemp<T, SIZE>:: Pop (T& element
)
{
if (IsEmpty())
 return false;
element =Buffer[top];
top--;
return true;
}
根据实际需要,还可以扩充堆栈功能。例如:加入取栈顶元素、求堆栈长度等操作,其方法
如上。
2. 通用链栈的实现
模板类中允许使用指针和定义自己的结构,这就为实现链式结构提供了保证。这里采用一
个单链表来实现堆栈,栈顶指针指向链表的第一个结点,入栈和出栈均在链表的头进行。
该模板类的定义如下:
template <class T> class CLinkStackTemp
{
public:
 //类的缺省构造函数,生成一个空堆栈
CLinkStackTemp ()
{
top=NULL;
};
~ClinkStackTemp(){}; //析构函数
 //定义结点结构
 struct node
{
T
  data; //入栈元素
 node* next; //指向下一结点的指针
};
 void SetEmpty(); //置空堆栈
 bool IsEmpty(); //判断堆栈是否为空
 bool Push(T element); //压入堆栈
 bool Pop(T& element);//弹出堆栈
private:
 node* top;
};
该类的成员函数实现如下:
template <class T> void CLinkStackTemp <T>::SetEmpty()
{
//释放堆栈占用的内存
node* temp;
while (top!=NULL)
{
 temp=top;
 top=top->next;
 delete temp;
}
}
template <class T> bool CLinkStackTemp <T>::IsEmpty()
{
return (top==NULL);
}
template <class T> bool CLinkStackTemp <T>::Push(T element)
{
node* temp=new node();
if (temp ==NULL)
 return false ;
temp->data=element;
temp->next=top;
top=temp;
return true;
}
template <class T> bool CLinkStackTemp <T>::Pop(T& element)
{
if ( IsEmpty())
 return false;
node* q = top;
element = top->data;
top=top->next;
delete q;
return true;
}
与顺序栈的实现略有不同,链栈不必指定栈的容量,其大小可以是近似"无限"的。为了程
序的使用方便,我们同样可以加入一些增强的功能。
三、 通用堆栈类的使用
通用堆栈类的使用较为简单,堆栈类的实例就是一个可以方便使用的堆栈。对堆栈的操作
都是通过类的成员函数来实现的。使用的具体步骤如下:
1. 在要使用堆栈类的程序代码的文件开头包括模板类及其成员函数的定义。
2. 类的实例化,可声明成变量,也可以声明它的指针,如:
CArrayStackTemp <int, 100> intStack; //生成一个长度为100的int型堆栈
//生成一个元素为Record型的堆栈,Record为自定义结构
CLinkStackTemp <Record>* RecordStack;
RecordStack=new CLinkStackTemp<Record>;
应注意在定义顺序栈时,必须指定栈的大小,而链栈则不必。另外在指定指针类型和执行
new操作时,必须对模板参数赋值,并且前后要一致。
3. 对堆栈进行操作,如:
intStack.Push(3); //将整数3入栈
RecordStack.SetEmpty(); //将堆栈置空
无论我们使用哪种堆栈类,对用户来讲都是透明的,操作起来并无差别。

LAMMPS ReaxFF模拟后处理:如何用Python精准追踪C-N键的断裂与形成? 本文详细介绍了如何利用Python对LAMMPS ReaxFF模拟结果进行后处理,精准追踪C-N键的断裂与形成过程。通过解析键级输出文件、构建原子类型映射字典,并实现C-N键的统计与可视化,为材料科学和催化反应研究提供了高效的数据析解决方案。文章特别强调了ReaxFF力场在断键析中的关键作用,并提供了完整的Python代码实现。 阅读详情

相关推荐

安装anaconda3时出现错误:Failed to link extracted packages to D:\anaconda!...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1430

template用法(超详细)

假如我们有以下函数 int compare(const string &v1,const string &v2) { if(v1<v2)return -1; if(v1>v2)return 1; return 0; } 这个函数比较两个值并指出两个值的大于,小于或者等于关系。 1.函数模板 1. template<typename T> int compare(const T&v1,const T&v2) {

m0_52902391的博客 7万+

双对数坐标曲线的自绘实现,可直接用

https://blog.csdn.net/Yyuanyuxin/article/details/109176493,效果如博客所示,为双对数坐标的折线图绘制,已封装成控件,可直接使用,带源码,没添加的属性,也可直接修改添加。

template的使用

1、template的使用 C++ 的高级玩法,当然包含了模板。模板(template)是实现代码重用机制的一种工具,它可以实现类型参数化,把类型定义为参数(模板...

weixin_45595778的博客 6000

一文说清楚c++模板Template用法

一文说清楚c++模板Template用法

u010196944的博客 5087

C++ Template

引言 模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream。 函数模板 在c++入门中,很多人会接触swap(int&amp;, int&amp;)这样的函数类似代码如下: void swap(int&amp;a , int&amp; b) { int...

weixin_34413802的博客 1203

python中template用法,python中template函数

True [tru:] 真,正确的(成立的) False [fɔ:ls] 假,错误的(不成立的) encode [ɪnˈkəʊd] 编码。location [ ləu"keiʃən] 位置(文件在电脑中的位置) encoding [in"kəudiŋ] 编码。transition [ træn"ziʃən] object [ "ɔbdʒi kt ] 对象, 物体。clear [kliə] 清空,清除,清楚的. iterator [itə"rei tə] 迭代器。

2301_81896552的博客 1333

template>标签的用法

template标签的使用方式,原生的和在vue中使用有哪些区别,一文带你了解

qq_48795482的博客 1974

art-template基本用法例子

art-template基本用法例子 <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <title>art-template例子</title> <script src="art-template.js"></script> </hea...

abckingaa的博客 2135

C++模版template用法

template用法 C++和python区别: C++是强类型语言,python是弱类型语言; 区别在于,python可以把任意类型的变量传入处理,而C++需要声明不同的变量类型; 这就导致了,若编写一个比大小的函数,C++要写int/float/char等等的多种,很麻烦; 因此出现了template模版的定义; 如下列实现了一个不区int/float/…比较大小的函数 template...

luhao19980909的博客 1419

vue template和html5的template用法比较

vue template和html5的template用法比较 1.html5中的template标签 html中的template标签中的内容在页面中不会显示。但是在后台查看页面DOM结构存在template标签。这是因为template标签天生不可见,它设置了display:none;属性。 2.template标签操作的属性和方法 content属性:在js中template标签对应的dom对象存在content属性,对应的属性值是一个dom节点,节点的nodeName是#document-fragm

qq_40891322的博客 1327

template标签用法(含vue-template用法

template标签用法(含vue) 1、h5中的template标签 html中的template标签中的内容在页面中不会显示。但是在后台查看页面DOM结构存在template标签。这是因为template原本是不可见的,它设置了display:none属性。 <!--显示"abc"这个内容,不显示"template",这是因为template标签天生不可见--> <template><div>template</div></template&

usernamecunzai的博客 1385

Go Template 用法详解

在一些前后端不离的Web架构中,我们通常需要在后端将一些数据渲染到HTML文档中,从而实现动态的网页(网页的布局和样式大致一样,但展示的内容并不一样)效果。我们这里说的模板可以理解为事先定义好的HTML文档文件,模板渲染的作用机制可以简单理解为文本替换操作–使用相应的数据去替换HTML文档中事先准备好的标记。Go语言内置了文本模板引擎text/template和用于HTML文档的html/template

qq_34125999的博客 2798

vue中template标签的用法

本文介绍了HTML中<template>标签的作用及其在Vue.js中的使用场景。<template>标签作为模板占位符,其内容在页面渲染时不会显示,但在DOM结构中存在。文章详细探讨了<template>标签的可见性控制,包括作为根元素时的默认可见性、嵌套时的不可见性,以及通过v-if指令使其内容可见的方法。此外,文章还介绍了如何在Vue.js中使用<template>标签结合v-for进行列表渲染,以及如何通过v-slot实现插槽功能,展示了<tem

2301_76459194的博客 402

vue template指定一段html,详解template标签用法(含vue中的用法总结)

一、html5中的template标签html中的template标签中的内容在页面中不会显示。但是在后台查看页面DOM结构存在template标签。这是因为template标签天生不可见,它设置了display:none;属性。我是template我是自定义表现abc二、template标签操作的属性和方法content属性:在js中template标签对应的dom对象存在content属性,对...

weixin_39720662的博客 1516

【C++】模板中template、typename的非常见用法

或者可以简单理解成:除了使用typename修饰之外,template内的任何标识符号都被视为一个值/成员而不是一个类型。

木牛的博客 2094

C/C++: 关键字template用法

template

weixin_42849849的博客 840
上一篇: 链表中链入对象
下一篇: c#索引示例
acefly
博客等级 码龄19年 3粉丝 14原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值