模板和STL
一、模板的背景知识
1.针对不同的类型定义不同函数版本。
2.借助参数宏摆脱类型的限制,同时也因为失去的类型检查而引
入风险。
3.借助于编译预处理器根据函数宏框架,扩展为针对不同类型的
具体函数版本,一方面统一编写通用的算法和结构,另一方面
也具有函数调用的类型安全性。
4.通过编译器根据函数模板生成具体函数——类型参数化。
int add (int x, int y) { ... } // x和y是值参数
int a = 10, b = 20, c;
c = add (a, b);
template<typename T> // T是类型参数
T max (T x, T y) { ... }
max<int> (...);
max<double> (...);
模板更多是使用预定义模板:string/auto_ptr/list/QList
二、函数模板
1.函数模板代表一个函数族,虽然其外观类似于普通函数,但其
带有参数化的类型(类型参数)。编译器编译函数模板时将类
型参数编程具体类型,生成具体函数的二进制代码。
2.函数模板的定义
template<模板参数表>
返回类型 模板函数名 (调用参数表) { 模板函数体; }
模板参数表:typename 模板参数1, typename 模板参数2, ...
模板参数的命名规则与一般有效标识符的命名一样:以字母或下
划线开始,由字母、数字或下划线组成。
typename关键字也可以用class替换,但是这里的class并不表
示类,而且不用换成struct。
template<typename T>
T max (T x, T y) { ... }
template<class T>
T max (T x, T y) { ... }
max<Student> (...);
max<string> (...);
max<int> (...);
max<double> (...);
3.函数模板的使用
函数模板名<模板参数表> (调用参数表);
1)编译器根据调用函数模板时所提供的模板实参,将所调用的函
数模板编译成具体函数的过程,称为函数模板的实例化。
2)用于实例化函数模板的类型必须满足模板内部基于该类型的操
作。
3)函数模板的二次编译。编译器第一次看到函数的定义,因为不
知道其中的模板参数是什么类型,所以无法成生成二进制指令,
但是编译器会首先做与类型无关的语法检查,如果没有语法错误
,编译器会根据函数模板的定义生成一个内部表示。当编译器看
到对函数模板的调用语句时,将所提供的具体模板实参结合先前
生成的内部表示,产生具体函数的二进制指令。
4)对于函数模板一定要让编译器在看到调用语句的同时,也能看到该模板的定义代码,否则编译器无法完成第二次编译,也就无
法生成具体的函数代码。为此,最简单的做法是,将函数模板的定义放在头文件中,所有需要使用该函数模板的源文件都要包含
此头文件。
4.函数模板参数的隐式推断
5.函数模板的重载:在提供通过规则的同时,专门针对某些特殊
类型给出特殊的实现。
三、类模板
1.类的成员变量、成员函数(普通/静态/构造/析构/运算符)的返
回值/参数/局部变量,以及基类中的类型都可以参数化,这样的
模板就称为类模板。
2.定义类模板
template<模板参数表>
class 类模板名 { ... };
类模板的每个成员函数无论其是否带有类型参数,都是函数模板。如果在类模板的外部定义成员函数,必须按照函数模板的语法
定义它们。
tempalte<模板参数表>
返回类型 类模板名<模板参数表>::成员函数名 (调用参数表){...}
3.使用类模板
类模板并不是一个类型,只有当其余具体模板参数结合以后,才
会变成类,才是一个具体类型。类模板变成具体类的过程,叫做
类模板的实例化。
类模板名<模板参数表>
~~~~~~~~~~~~~~
类 -> 访问其静态成员、定义变量/创建对象
类模板只能显式实例化,不支持隐式推断。
编译期 运行期
类模板 -实例化-> 类 -实例化-> 对象
编译器 处理器
类模板的模板参数可以带有缺省值,而且参数缺省值必须靠右。
C++98中函数模板不可以带有缺省值,但是在C++2011中函数
模板也可以带有缺省值(-std=c++0x)。
4.类模板的实例化
1)类模板中,只有那些被调用的成员函数才会被实例化,即产生
二进制代码。
2)某些类型虽然并没有提供类模板所需要的全部功能,但照样可
以实例化该类模板,只要不直接或间接调用那些依赖于未提供功
能的成员函数即可。
5.类模板的静态成员变量,在该类模板的每个实例化类中,都有
一份独立的拷贝,并为该实例化类的所有实例化对象所共享。
6.类模板的递归实例化
用一个类模板的实例化类型实例化该类模板自身。用这种方法可
以很容易地构建在空间上具有递归结构的逻辑模型。
List<Array<int> > : 数组链表
Array<List<int> > : 链表数组
List<List<int> > : 二维链表
Array<Array<int> > : 二维数组
7.类模板的特化
1)通过特化类模板,可以优化针对某种特定类型的实现,或者克
服某种特定类型在实例化类模板时所表现出的不足。
2)特化一个类模板需要特化该类模板的所有成员函数——全类特化。
template<>
class 类模板名<特化所针对的模板参数> { ... };
全类特化的版本可以和基本版本完全不同。
3)如果类模板只有部分成员函数的实现与类型相关,那么也可以
只针对该成员函数进行特化——成员特化。
类模板成员函数的特化版本与其基本版本共享同一个声明,因此
特化版本与基本版本的函数原型,除了模板参数外,必须严格一致。
8.类模板的局部特化(偏特化)
1)类模板可以局部特化,即一方面为类模板指定特定的实现,另
一方面又允许用户对部分模板参数自行指定。
2)如果多个局部特化同等程度地匹配某个声明,那么该声明将因
二义性而导致歧义错误。
3)函数模板不支持局部特化。

STL模板_概念的更多相关文章

  1. STL模板_容器概念

    一.STL(Standard Template Library,标准模板库)概述1.容器:基于泛型的数据结构.2.算法:基于泛型的常用算法.3.迭代器:以泛型的方式访问容器中的元素,是泛型的算法可以应 ...

  2. STL模板_智能指针概念

    一.智能指针1.类类型对象,在其内部封装了一个普通指针.当智能指针对象因离开作用域而被析构时,其析构函数被执行,通过其内部封装的普通指针,销毁该指针的目标对象,避免内存泄露.2.为了表现出和普通指针一 ...

  3. STL模板_十大容器概念

    一.向量(续)1.大小和容量大小:容器中元素的个数.容量:容器中可容纳元素的个数.size_type size (void) const; // 获取大小void resize (size_type ...

  4. 泛型编程、STL的概念、STL模板思想及其六大组件的关系,以及泛型编程(GP)、STL、面向对象编程(OOP)、C++之间的关系

    2013-08-11 10:46:39 介绍STL模板的书,有两本比较经典: 一本是<Generic Programming and the STL>,中文翻译为<泛型编程与STL& ...

  5. C++_进阶之函数模板_类模板

     C++_进阶之函数模板_类模板 第一部分 前言 c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...

  6. STL 容器的概念

    STL 容器的概念 在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要. 经典的数据结构数量有限,但是我们 ...

  7. DLL中导出STL模板类的问题

    接上一篇. 上一篇的dll在编译过程中一直有一个警告warning C4251: ‘CLASS_TEST::m_structs’ : class ‘std::vector<_Ty>’ ne ...

  8. JavaWeb_(session和application)用户登录注册模板_进阶版

    用户登录注册模板_基础版 传送门 用户登录注册模板进阶版 添加了获得获得当前登录用户信息及存储登录人数 用户登录后,在首页.注册页.登录页显示登录用户信息和存储登录人数信息 目录结构 <%@pa ...

  9. C++ 泛型程序设计与STL模板库(1)---泛型程序设计简介及STL简介与结构

    泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念 用来界定具备一定功能的数据类型.例如: 将 ...

随机推荐

  1. Copy from chromium-dev!

    https://app.yinxiang.com/pub/gguangle0/chromium-dev 做了一些搬运工的活..............

  2. UITabBarController 笔记(二) ViewController中加UITabBarController

    新建一个简单视图iOS工程,在ViewController的viewDidLoad中代码如下 - (void)viewDidLoad { [super viewDidLoad]; // Do any ...

  3. 新手求大神,有其他swit-case的思路写这个程序么?

    两个程序: switch-case与if-else if的区别相同点:可以实现多分支结构;不同点:switch:一般只能用于等值比较.(可以进行范围运算???---学会用switch计算范围出炉的思路 ...

  4. js格式化日期yyyyMMdd

    先来一个土方法: <script>function getyyyyMMdd(){ var d = new Date(); var curr_date = d.getDate(); var ...

  5. JAVA设计原则

      1.单一职责规则(SRP):有且仅有一个原因引起类的变化. 2.依赖倒置规则(DIP): 高层模块不应该依赖底层模块,两者都用依赖接口: 接口不依赖细节: 细节依赖接口. 3.接口隔离规则:类间的 ...

  6. Linux学习之修改主机名

    1.临时修改主机名 显示主机名: oracle@localhost:~$ hostname localhost 修改主机名: oracle@localhost:~$ sudo hostname orc ...

  7. 你的阅读造就了你 You are what you read

    在豆瓣上看到的一篇很有思想和正能量的文章,在这里请允许我用原创的方式来呈现给大家.如果你是在校的大学生或者研究生博士生,这篇文章会让你有很多的共鸣.如果你已真正的踏入这个社会,也将受益匪浅.   电脑 ...

  8. 高精度 java的一些题

    poj 1001 Exponentiation import java.util.*; import java.math.*; public class Main { public static vo ...

  9. hdu 5637 Transform 最短路

    题目链接 异或的性质. 求s到t的最少步骤, 等价于求0到s^t的最少步骤. 通过最少的步骤达到s^t的状态, 等价于求0到s^t的最短路. 先将最短路求出来然后O(1)查询. #include &l ...

  10. OpenGL绘制环形渐变

    开始看计算机图形学和OpenGL,挺有意思就自己随便写了一些效果. 以中间点坐标为圆心,计算每一点和圆心距离,根据距离算出一个RGB值,于是整体便呈现环形分布. 代码如下: #include < ...