• 类模板

    • 类模板stack的实现
    • 拷贝构造函数和赋值运算符
    • 类模板的特化
    • 局部特化
    • 缺省模板实参

类模板

类模板stack的实现

有两个角度观察STL中的stack模板类

  • 模板类

通过将stack定义为模板类的形式实现stack类实体对不同类型数据(模板参数指定)的存储支持。

template<typename T>
class stack
{
...
private:std::deque<T> elems;
}
  • 适配器

以某种既有容器作为底部结构,将其接口改变,使之符合“先进后出”的特性,形成一个stackSTL deque是双向开口的数据结构,以deque作为底部结构并封闭其头端开口,便可实现一个stackSTL便以deque作为缺省情况下的stack的底部结构。(使用deque而不是vector来实现一个stack是有好处的,当删除元素时,deque会释放内存,当需要重新分配内存时,deque的元素不需要被移动)。

像这种狐假虎威,完全以底部容器完成全部工作,而具有修改某物接口,形成另一种风貌性质者,称为adapter(配接器)。STL的观点来看,stack往往不被归类为container,而被归类为container adapter,对底层容器的配接。

#include <deque>
#include <stdexpt>template<typename T>
class stack
{
public:void push(const T&);void pop();const T& top() const;T& top();bool empty() const { return elems.empty();}
private:std::deque<T> elems;
}template<typename T>
void stack<T>::push(const T& elem)
{elems.push_back(elem);      // 末尾进
}template<typename T>
void stack<T>::pop()
{if (empty())throw std::out_of_range("stack<>::pop(): empty stack");elems.pop_back();           // 末尾出
}template<typename T>
const T& stack<T>::top() const
{if (empty())throw std::out_of_range("stack<>::top(): empty stack");return elems.back();
}template<typename T>
T& stack<T>::top()
{if (empty())throw std::out_of_range("stack<>::top(): empty stack");return elems.back();
}

拷贝构造函数和赋值运算符

  • 类名:Stack
  • 类的类型:Stack
template<typname T>
class Stack
{
public:Stack(const Stack<T>& rhs);Stack<T>& operator=(const Stack<T>& rhs);
}

类模板的特化

可以使用模板实参来特化类模板。为了特化一个类模板,你必须在起始处声明一个template<>(告诉编译器,这是一个特化版本),接下来声明用来特化的类模板的类型。如果你要特化一个类模板,你还要特化该类模板的所有成员函数。

template<>
class Stack<std::string>
{...}

进行类模板的特化时,每个成员函数都必须定义为普通函数,原来模板函数中的每个T也被相应的特化的类型所取代:

void Stack<std::string>::push(const std::string& elem)
{elems.push_back(elem);
}

在特化的版本中,我们也可将底层容器类型改变为vector,这说明,特化的实现可以和基本类模板(primary template)的实现完全不同。

局部特化

类模板可以被局部特化。在特定的环境下指定类模板的特定实现,并且要求某些模板参数仍然必须由用户来定义。

template<typename T1, typename T2>
class MyClass
{...
}

可以做如下的局部特化:

// 局部特化:两个模板参数具有相同的类型
template<typename T>
class MyClass<T, T>
{...
}// 局部特化:指定第二个模板参数为int
template<typename T>
class MyClass<T, int>
{...
}// 局部特化,两个模板参数都是指针类型
template<typename T1, typename T2>
class MyClass<T1*, T2*>
{...
}

下述的代码将展示会优先使用哪些模板:

MyClass<int, float> mif;        // MyClass<T1, T2>
MyClass<float, float> mff;      // MyClass<T, T>
MyClass<float, int> mfi;        // MyClass<T, int>
MyClass<int*, float*> mp;       // MyClass<T1*, T2*>

如果有多个局部特化同等程度地匹配某个声明,称这样的声明具有二义性。

MyClass<int, int> mii;      // 错误:同等程度地匹配MyClass<T, T>, MyClass<T, int>
MyClass<int*, int*> mpp;    // 错误:同等程度地匹配MyClass<T, T>, MyClass<T1*, T2*>

为了解决第二种二义性,可提供一种指向相同类型指针的特化:

template<typename T>
class MyClass<T*, T*>
{...}

缺省模板实参

template<typename T, typename CONT = std::deque<T> >
class Stack
{
public:void push(const T& elem);
private:CONT elems;
};template<typename T, typename CONT>
void Stack<T, CONT>::push(const T& elem)
{elems.push_back(elem);
}

C++基础——类模板相关推荐

  1. 二叉树应用-Huffman树类模板的实现(数据结构基础 第6周)

    简单实现来了Huffman树,在找最小堆的过程中使用到了自己做的最小堆MinHeap. 之前写的关于树的类模板中一直存在一个问题:结点的内存管理太混乱,有些甚至存在临时变量里.这里直接在类内直接定义了 ...

  2. C++ 泛型编程(一):模板基础:函数模板,类模板,模板原理,模板匹配规则

    类模板 函数模板 泛型编程 泛型编程,泛型即是指具有在多种数据类型上皆可操作的含义,其实就是能够帮助开发者编写完全一般化并可重复使用的算法,同样的工作不需要做多次,同样的算法针对不同的类型也不应该写多 ...

  3. 【C++基础】 类模板

    类模板 模板是将类中某些类型变为泛型,从而定义一个模板. 如下: 类模板的语法 直接进行对比: 泛型化之前 泛型化之后 类模板的实例化 注意:只要是对类模版进行实例化,编译器就会生成一个类!!! 显式 ...

  4. [C++基础]034_C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)

    http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/18/2728753.html 1.  主版本模板类 首先我们来看一段初学者都能看 ...

  5. C++ 泛型编程(一):模板基础:函数模板、类模板、模板推演成函数的机制、模板实例化、模板匹配规则

    文章目录 泛型编程 函数模板 函数模板实例化 隐式实例化 显式实例化 函数模板的匹配规则 类模板 类模板的实例化 泛型编程 泛型编程旨在削减重复工作,如: 将一个函数多次重载不如将他写成泛型. voi ...

  6. 【C++基础学习】引起类模板被实例化情形总结

    在我们使用类模板时,只有当代码中使用了类模板的一个实例的名字,而且上下文环境要求必须存在类的定义时,这个类模板才被实例化.并不是每次使用一个类都要求知道该类的定义. (1)声明一个类模板的指针和引用, ...

  7. C++基础:模板,函数模板和类模板

    文章目录 1. 函数模板 2. 类模板 3. 模板特化 3.1 函数模板特化 3.2 类模板特化 4. 非类型模板参数 模板是允许函数或类通过泛性的形式表现或运行的特性 1. 函数模板 模板可以使函数 ...

  8. C++基础:模板:函数模板和类模板

    模板: 为了代码重用,代码就必须是通用的:通用的代码就必须不受数据类型的限制. 那么我们可以把数据类型改为一个设计参数.这种类型的程序设计称为参数化(parameterize) 程序设计. 软件模块由 ...

  9. 全面总结C++类模板使用的基础知识

    ✨引言 书接上文,今天来学习C++模板知识中的第二大模块,也就是类模板的使用. <C++提高编程>专栏主要针对C++泛型编程和STL技术做详细讲解,深入研究C++的使用,对C/C++感兴趣 ...

最新文章

  1. 【CV】Python下载安装及环境变量配置教程
  2. Linux下fork()函数
  3. 【企业管理】商业伦理逻辑思考模型
  4. CVPR 2020 论文和开源项目合集(Papers with Code)
  5. 蓝桥杯 基础训练 试题集汇总【13道】
  6. BeetleX.Redis基础操作和对象格式
  7. Find a way——BFS
  8. Github 简明教程 - 添加远程库
  9. 数据还是模型?人类知识在深度学习里还有用武之地吗?
  10. python使用ddt找不到方法_python使用ddt过程中遇到的问题及解决方案【推荐】
  11. linux中线程的问题,linux中的线程问题
  12. oc实时渲染的图如何导出_VR批量渲染如何同时保存通道图?「渲云渲染」
  13. BorisFX Sapphire 2019 for OFX Mac使用教程
  14. html drag 例子,html5 drag事件用法
  15. ajaxfileupload -- 一款不错的AJAX文件上传插件
  16. 服务器被攻击 显示503,打开网页后出现503 service unavailable等字样,什么意思
  17. 每日一诗词 —— 热爱生命
  18. 使用开源人脸特征提取器进行脸部颜值评分
  19. 什么是逻辑结构以及物理结构
  20. silvaco 仿真BJT

热门文章

  1. java一览删除一条数据_可以删除单条数据,不能再返回列表页面,我使用的是Spring MVC...
  2. 为什么应尽量从列表的尾部进行元素的增加与删除操作?
  3. 2005年1月8日——最伤心的一天
  4. HiveQL学习笔记(三):Hive表连接
  5. Git显示漂亮日志的小技巧
  6. NopCommerce(Core)学习目录
  7. Scrapy 教程(九)-日志系统
  8. BZOJ2563 阿狸和桃子的游戏
  9. 过滤器-filter
  10. main函数参数解析