当前位置: 首页 > news >正文

C++之模板(二)

1、类模板

2、使用类模板

类模板在使用的时候要显示的调用是哪种类型,而不是像函数模板一样能够根据参数来推导出是哪种类型。

Stack.h

#include <stdexcept>template <typename T>
class Stack
{
public:explicit Stack(int maxSize);~Stack();void Push(const T& elem);void Pop();T& Top();const T& Top() const;bool Empty() const;private:T* elems_;int maxSize_;int top_;
};template <typename T>
Stack<T>::Stack(int maxSize) : maxSize_(maxSize), top_(-1)
{elems_ = new T[maxSize_];
}template <typename T>
Stack<T>::~Stack() {delete []elems_;
}template <typename T>
void Stack<T>::Push(const T& elem)
{if (top_ + 1 >= maxSize_){throw std::out_of_range("Stack<T>::Push stack full");}elems_[++top_] = elem;
}template <typename T>
void Stack<T>::Pop()
{if (top_ + 1 <= 0){throw std::out_of_range("Stack<T>::Pop stack empty");}--top_;
}template <typename T>
T& Stack<T>::Top()
{if (top_ + 1 <= 0){throw std::out_of_range("Stack<T>::Top stack empty");}return elems_[top_];
}template <typename T>
const T& Stack<T>::Top() const
{if (top_ + 1 <= 0){throw std::out_of_range("Stack<T>::Top stack empty");}return elems_[top_];
}template <typename T>
bool Stack<T>::Empty() const {return top_ + 1 == 0;
}

main.cpp

#include <iostream>
using namespace std;
#include "Stack.h"
int main() {Stack<int> s(10);s.Push(1);s.Push(2);s.Push(3);while (!s.Empty()){cout << s.Top() << endl;s.Pop();}return 0;
}// 输出
3
2
1

3、非类型模板参数

Stack2.h

#include <stdexcept>template <typename T, int MAX_SIZE>
class Stack2
{
public:Stack2();~Stack2();void Push(const T& elem);void Pop();T& Top();const T& Top() const;bool Empty() const;private:T* elems_;int top_;
};template <typename T, int MAX_SIZE>
Stack2<T, MAX_SIZE>::Stack2() : top_(-1)
{elems_ = new T[MAX_SIZE];
}template <typename T, int MAX_SIZE>
Stack2<T, MAX_SIZE>::~Stack2() {delete []elems_;
}template <typename T, int MAX_SIZE>
void Stack2<T, MAX_SIZE>::Push(const T& elem)
{if (top_ + 1 >= MAX_SIZE){throw std::out_of_range("Stack2<T>::Push stack full");}elems_[++top_] = elem;
}template <typename T, int MAX_SIZE>
void Stack2<T, MAX_SIZE>::Pop()
{if (top_ + 1 <= 0){throw std::out_of_range("Stack2<T>::Pop stack empty");}--top_;
}template <typename T, int MAX_SIZE>
T& Stack2<T, MAX_SIZE>::Top()
{if (top_ + 1 <= 0){throw std::out_of_range("Stack2<T>::Top stack empty");}return elems_[top_];
}template <typename T, int MAX_SIZE>
const T& Stack2<T, MAX_SIZE>::Top() const
{if (top_ + 1 <= 0){throw std::out_of_range("Stack2<T>::Top stack empty");}return elems_[top_];
}template <typename T, int MAX_SIZE>
bool Stack2<T, MAX_SIZE>::Empty() const {return top_ + 1 == 0;
}

main.cpp

#include <iostream>
using namespace std;
#include "Stack2.h"
int main() {Stack2<int, 10> s;s.Push(1);s.Push(2);s.Push(3);while (!s.Empty()){cout << s.Top() << endl;s.Pop();}return 0;
}// 输出
3
2
1
http://www.lryc.cn/news/376189.html

相关文章:

  • 相机的标定
  • C# 利用XejeN框架源码,编写一个在 Winform 界面上的语法高亮的编辑器,使用 Monaco 编辑器
  • 03- jQuery事件处理和动画效果
  • RabbitMQ 入门
  • 物联网协议应用
  • 十分钟学会微调大语言模型
  • 结合简单工厂和工厂方法模式:实现灵活的对象创建
  • 网抑云特殊版,登录即永久
  • Kotlin 实战小记:No-Arg 引用解决 No constructor found的问题
  • HTML(5)——列表表格
  • FreeBSD通过CBSD管理低资源容器jail来安装Ubuntu子系统实践
  • SpringCloud总结(springcloud alibaba)
  • 轻轻松松上手的LangChain学习说明书
  • 全面对比与选择指南:Milvus、PGVector、Zilliz及其他向量数据库
  • svm 超参数
  • 001-基于Sklearn的机器学习入门:Sklearn库基本功能和标准数据集
  • 充电学习—7、BC1.2 PD协议
  • 技术点梳理0618
  • 石英砂酸洗提纯方法和工艺
  • linux安装dgl
  • 【SAP-ABAP】-权限批导-批量给某个角色导入事务码权限
  • 异常处理总结
  • 大模型日报2024-06-18
  • NumPy 双曲函数与集合操作详解
  • ABSD-系统架构师(十三)
  • PLC通过Profibus协议转Modbus协议网关接LED大屏通讯
  • 第二十三篇——香农第二定律(二):到底要不要扁平化管理?
  • stm32f103 HAL库 HC-SR04测距
  • vue中通过自定义指令实现一个可拖拽,缩放的弹窗
  • FreeRtos-09事件组的使用