//盛夏白瓷梅子汤,碎冰破壁叮咚响
2020.6.7 苏
预备tips:
①形如int arr[10],double b[2]即可创建数组
②//用new申请的动态内存可以用delete释放
int *ptr1 = new int [3];
delete ptr1;//仅删除ptr1[0]
int *ptr2 = new int [3];
delete []ptr2;//释放整个对象数组指针指向的内存
③模板类的接口和实现(类定义和类实现(成员函数定义)放在同一个头文件中)
一.基础知识
1.创建类模板
#include//双队列deque对象是堆栈Stack的默认适配器
template //类型形参表中关键词typename与class可以互换;多个形参的类型形参表形如<class A, classB>
class Stack // Stack只能对栈顶进行插入删除操作
{
public:
T&top()
{return stack.front()}//返回一个栈顶元素的引用

void push(const T& value)
{stack.push_front(value)}//在栈顶加一个元素

void pop()
{stack.pop_front();}//删除栈顶元素

bool isEmpty() const
{ return stack.empty();}//堆栈为空则返回1

size_t size() const
{ return stack.size();}//返回元素个数
2.可以在类模板定义之外声明类模板成员函数
函数定义格式如下
template
inline void Stack::pop()//Stack的默认形参在函数定义中不必声明

{stack.pop_front();}
3.测试类模板
①Stack doubleStack;//创建实例化的类对象
或者Stack intStack
//即在类声明之外出现类名的地方都要用 类名;实例化时用如 类名
②while( !intstack.isEmpty() )
{
cout<<intStack.top()<<’ ';
intstack.pop();
}
4.使用函数模板来操作类模板实例化的对象
①当创建好类模板实例化对象后,可以在驱动程序里定义函数类模板,以实例化对象为形参。
②#include<Stack.h>
template//注:这段发生在main函数前
void testStack(Stack&theSatck, const T&value, size_t size)//函数形参表中至少一个形参为类型形参表中的形参
{ …; } //模板函数不支持默认模板形参
③函数模板实例化
template
void swap(T&a,T&b)
swap(a,b){…};//对于成员模板函数调用时用 对象名.swap(a,b){…};
5.形参
①使用非类型(模板)形参,可以有默认的实参作为常量处理
1°模板声明的开始部分为template<typename T,size_t N>
比如对array类模板进行特化用array<int ,100>arr;
2°可以有缺省参数
例一:template<class T,int i=10>//类型形参实例化为类型,普通形参实例化为数据
Stack<double,100>stack;用了默认参数便是Stackstack;
例二:template
Stack<>stack;
//注意C++标准库中Stack模板开始部分为template<class T,class Container=deque>
//即默认下stack对象用deque对象保存satck对象的元素,可声明为Stackvalues;
6.特化类模板
template<>
class A<int,double>//类型明确化,是个全特化类,被称为全特化的类,必须有一个主模板类
{
public:
void function(int value1,double value2)
{};
};
int main()
{
A<int,double>a;}
二.强化知识
1.类A可以声明为模板类B特化的友元
【例题1】:
template
class linkedstack;
//完成链栈类声明

//完成类Node定义
template<typename T>
class Node
{friend linkedStack<T>//声明特化友元
private:T data;Node<T>* link;//该指针作用为  指向链栈中向底部的下一个Node元素
};
```cpp
//完成自定义类型linkedStack的输出重载
template<typename T>
ostream& operator<<(ostream& out, linkedStack<T>& s)
{T elem;while (!s.isEmpty()){s.Delete(elem)//先把栈顶元素赋值给elem,再删去栈顶元素out << elem << endl;}return out;
}

```cpp
//完成自定义类linkedStack的定义
template<class T>
class linkedStack//链栈中每个元素都是Node类对象
{friend ostream& operator<<(ostream&, linkedStack<T>&)//将自己的输出重载声明为友元函数
private:Node<T>* top;
public:linkedStack() { top = 0; }//刚声明类对象时使top指针不指向任何地方~linkedStack();//每次析构删去一个栈顶,top指向原栈顶下面一个元素。一会儿在类定义外定义析构函数。bool isEmpty()const{return top == NULL}linkedStack<T>& Add(T& x);linkedStack<T>& Delete(T& x);}
//完成类定义外对Add成员函数的定义
template<class T>
linkedStack<T>& linkedStack<T>::Add(const T& x)
{Node<T>* p = new Node<T>;p->data = x;p->link = top;//新顶元素link指针指向原top指针指向的元素,即新顶元素的link指向原顶元素top = p;//top指向新顶元素return *this;
}
//完成类定义外对Delete成员函数的定义
linkedStack<T>& linkedStack<T>::Delete(T& x)
{Node<T>* tempp = NULL;x = top->data;//在弹出栈顶元素前先把它赋值给x,以备后用tempp = top->link;delete top;return *this;
}
完成类定义外对析构函数的定义
template<class T>
linkedStack<T>::~linkedStacked()
{Node<T>* next;while (top!=0){next = top->link;delete top;top = next;}//释放整个对象内存
}

【例题2:使用int模板非类型参数numberOfElements和类型参数elementType来帮助创建数组类的模板。此模板将允许在编译时用指定元素类型的指定数量的元素实例化数组对象。】

#include<iostream>
#include<string>
using namespace std;
template<typename elementType, int numberOfElements>
class Array
{private:elementType* ptr;//创建指针
public:Array(){ptr = new elementType[numberOfElements];//在构造函数中建立好确定大小的数组指针ptr,即指向数组的指针。//指向numberOfElement个元素。}~Array(){delete[]ptr;//删除ptr指向的整个数组内存}int getnumberOfElements()const{return numberOfElements;}template<typename T1, int a>//自定义类型Array的输入输出重载friend std::ostream& operator<<(ostream& os, Array<T1, a>& rhs);template<typename T2, int b>friend std::istream& operator>>(istream& in, Array<T2, b>& rhs);
};
template<typename T, int a>
std::ostream& operator<<(ostream& os, Array<T, a>& rhs)
{for (int i = 0;i < a;i++)os << rhs.ptr[i] << " ";//数组指针名即数组名,再体会一下。创建了指针数组相当于创建了数组。return os;
}
template<typename T, int a>
std::istream& operator>>(istream& in, Array<T, a>& rhs)
{for (int i = 0;i < a;i++)in >> rhs.ptr[i];return in;
}
int main()
{cout << "Enter 5 integer values :\n";Array<int, 5>a;cin >> a;cout <<"The values in the intArray are : " <<a << endl;cout << "Enter 7 one - word string values :\n";Array<string, 7>b;cin >> b;cout << "The values in the stringArray are : " << b << endl;system("pause");
}

`

C++笔记(自定义模板)相关推荐

  1. Vue 学习笔记--自定义模板

    文章目录 @[TOC](文章目录) 一.自定义模板 1.1.通过template标签定义模板 1.2.将模板注册到Vue的Component中 1.3.在div中使用模板 1.4.完成代码 二.自定义 ...

  2. 今晚8点直播 | 详解基于百度自定义模板的OCR结果结构化处理技术

    随着行业的发展和技术的成熟,文字识别(OCR)目前已经应用到了多个行业中,比如物流行业快递包裹的分拣,金融行业的支票单据识别输入,交通领域中的车牌识别,以及日常生活中的卡证.票据识别等等.OCR(文字 ...

  3. 公开课报名 | 基于自定义模板的OCR结果的结构化处理技术

    随着行业的发展和技术的成熟,文字识别(OCR)目前已经应用到了多个行业中,比如物流行业快递包裹的分拣,金融行业的支票单据识别输入,交通领域中的车牌识别,以及日常生活中的卡证.票据识别等等.OCR(文字 ...

  4. Django 笔记4 -- 模板

    Django 笔记4 – 模板 Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: Django官 ...

  5. Django从理论到实战(part21)--自定义模板过滤器

    学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列 ...

  6. VS Code 安装插件、自定义模板、自定义配置参数、自定义主题、配置参数说明、常用的扩展插件

    1. 下载和官网教程 下载地址:https://code.visualstudio.com/ 官方教程:https://code.visualstudio.com/docs 2. 安装插件 安装扩展插 ...

  7. leangoo新增自定义模板、移动卡片、复制泳道功能

    本次更新增加了看板自定义模板,移动卡片和复制泳道功能,同时也对复制卡片.加载看板等功能进行了优化.以下是此次更新详情: 1. 自定义模板 您可以将已有的看板设置为自定义模板 自定义模板会复制看板内的成 ...

  8. 计算机教案word格式模板,用自定义模板编辑教案

    随着信息时代的到来以及个人计算机的飞速普及,各个中小学校都相继配置了办公用计算机.许多学校装备了微机室.微机备课室,甚至条件较好的学校为每一位教师都配备了一台个人计算机.也正是这样,许多教师的备课教案 ...

  9. php嵌套模板,thinkphp3.1自定义模板标签嵌套实现

    thinkphp3.1自定义模板标签嵌套实现 之前做的自定义标签,属性里面读取不到上层标签的值,然后找了很多文档发现没有能解决的,然后就自己研究了一下,搞出来了,下面是方法,绝对能用,不能用我吃了它. ...

最新文章

  1. 【ACE Meetup天津站】云计算时代的运维管理
  2. GNS3关联SecureCRT的配置。
  3. DevExpress Asp.net(6) ASPxLoadingPanel的基本使用
  4. sklearn逻辑回归 极大似然 损失_收藏!攻克目标检测难点秘籍二,非极大值抑制与回归损失优化之路...
  5. 重拾C,一天一点点_3
  6. [Swift]LeetCode968.监控二叉树 | Binary Tree Cameras
  7. InteliJ Idea通过maven创建webapp
  8. hdu 1232 经典并查集应用
  9. python模态窗口_python webdriver 对模态窗口的处理
  10. python获取windows当前登录用户名 域 计算机名 mac地址 ip
  11. 基于单片机的有害气体/空气质量监测系统设计(#0422)
  12. 基于粒子群算法的PID控制器优化设计
  13. springboot Validation
  14. 短期工作经历到底要不要写到简历上?
  15. 特拉华大学计算机科学怎么样,2020年特拉华大学排名TFE Times美国最佳计算机科学硕士专业排名第84...
  16. nginx验证微信文件
  17. WannaCry爆发一年后,EternalBlue的威胁仍然存在
  18. 日紫白飞星算法_地理紫白飞星择日口诀解析
  19. 三天学会网络爬虫之Day03
  20. 传奇开服微端是什么意思?微端服务器是什么?微端服务器配置要求

热门文章

  1. SVN Access to '/svn/Test/!svn/me' forbidden,不能更新解决办法
  2. 洛谷1846 游戏 dp
  3. linux dd命令卡住,dd后新盘系统无法启动,解决(上)
  4. 如何学好 AE 表达式?
  5. 大数据之路:数据同步
  6. Markdown技能树
  7. 《蜥蜴书》_讲义及源码解读_10
  8. 学计算机用什么cpu,做设计用什么cpu
  9. 物理笔记(1)--波函数中x/u符号的小思考
  10. 下一个倒计时又在哪里