STL模板_概念
模板和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模板_概念的更多相关文章
- STL模板_容器概念
一.STL(Standard Template Library,标准模板库)概述1.容器:基于泛型的数据结构.2.算法:基于泛型的常用算法.3.迭代器:以泛型的方式访问容器中的元素,是泛型的算法可以应 ...
- STL模板_智能指针概念
一.智能指针1.类类型对象,在其内部封装了一个普通指针.当智能指针对象因离开作用域而被析构时,其析构函数被执行,通过其内部封装的普通指针,销毁该指针的目标对象,避免内存泄露.2.为了表现出和普通指针一 ...
- STL模板_十大容器概念
一.向量(续)1.大小和容量大小:容器中元素的个数.容量:容器中可容纳元素的个数.size_type size (void) const; // 获取大小void resize (size_type ...
- 泛型编程、STL的概念、STL模板思想及其六大组件的关系,以及泛型编程(GP)、STL、面向对象编程(OOP)、C++之间的关系
2013-08-11 10:46:39 介绍STL模板的书,有两本比较经典: 一本是<Generic Programming and the STL>,中文翻译为<泛型编程与STL& ...
- C++_进阶之函数模板_类模板
C++_进阶之函数模板_类模板 第一部分 前言 c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...
- STL 容器的概念
STL 容器的概念 在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要. 经典的数据结构数量有限,但是我们 ...
- DLL中导出STL模板类的问题
接上一篇. 上一篇的dll在编译过程中一直有一个警告warning C4251: ‘CLASS_TEST::m_structs’ : class ‘std::vector<_Ty>’ ne ...
- JavaWeb_(session和application)用户登录注册模板_进阶版
用户登录注册模板_基础版 传送门 用户登录注册模板进阶版 添加了获得获得当前登录用户信息及存储登录人数 用户登录后,在首页.注册页.登录页显示登录用户信息和存储登录人数信息 目录结构 <%@pa ...
- C++ 泛型程序设计与STL模板库(1)---泛型程序设计简介及STL简介与结构
泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念 用来界定具备一定功能的数据类型.例如: 将 ...
随机推荐
- C# base和this[转]
new关键字引起了大家的不少关注,尤其感谢Anders Liu的补充,让我感觉博客园赋予的交流平台真的无所不在.所以,我们就有必要继续这个话题,把我认为最值得关注的关键字开展下去,本文的重点是访问关键 ...
- 不同版本的 IIS 中使用 ASP.NET MVC(C#)【转】
由微软 ASP.NET 团队|2008 年 8 月 19 日 推特 在本教程中,您将学习在不同版本的 Internet Information Services 中如何使用 ASP.NET MVC 和 ...
- 产品专家Marty Cagan:不做仅仅会编码的人
Marty Cagan是享有世界声誉的产品管理专家,曾担任Netscape副总裁.eBay产品管理及设计高级副总裁. 近日,记者在"PM-China首届产品经理高峰论坛"上对他做了 ...
- JavaScript之JSON
一.简介:Json是JavaScript中读取结构化数据更好的方式.因为Json数据可以直接传给eval(),而且不必创建DOM对象.Json是一种数据格式,不是一种编程语言,虽然具有相同的语法形式, ...
- SSIS之数据转换用法
当SSIS报错为:“无法在unicode和非unicode字符串数据类型之间转换”,可以考虑用数据转换器实现,很简单,如下图: 第一步,找到数据转换器: 第二步,编辑数据转换器: 第三步:编辑目标映射 ...
- C# 通过Devart连接Oracle(不需要客户端)
16年一月底回了四川,接下来两年就准备在四川工作了.哈哈,虽然收入比沿海城市少了很多,但离老家近些感觉还是很不错的哈,好了,废话不多说,直接上干货. 最近的项目需要用到C#连接Oracle,以前要么是 ...
- VBA基础——循环语句
VBA基础之循环语句 Sub s1() Dim rg As Range For Each rg In Range("a1:b7,d5:e9") If rg = "&quo ...
- Unity3D使用mesh创建一个正方形
using UnityEngine; using System.Collections; public class Quad : MonoBehaviour { // Use this for ini ...
- Python核心编程读笔 9: 异常
第10章 异常一.异常1 检测和处理异常 (1)try-except语句 try: try_suite #监控这里的异常 except Exception[, reason]: except_suit ...
- 物理引擎简介——Cocos2d-x学习历程(十三)
Box2D引擎简介 Box2D是与Cocos2d-x一起发布的一套开源物理引擎,也是Cocos2d-x游戏需要使用物理引擎时的首选.二者同样提供C++开发接口,所使用的坐标系也一致,因此Box2D与C ...