模板和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模板_概念
时间: 2024-10-07 07:04:26
STL模板_概念的相关文章
STL模板_智能指针概念
一.智能指针1.类类型对象,在其内部封装了一个普通指针.当智能指针对象因离开作用域而被析构时,其析构函数被执行,通过其内部封装的普通指针,销毁该指针的目标对象,避免内存泄露.2.为了表现出和普通指针一致的外观和行为,重载了解引用运算符(*)和间接成员访问运算符(->)函数,令其使用者可以将一个智能指针当成普通指针一样地使用.3.智能指针没有拷贝语义,只有转移语义,任何时候都只有一个智能指针对象持有真正的对象地址.4.智能指针不支持对象数组.二.模板的非类型参数1.无论是函数模板还是类模板,其模板
STL模板_十大容器概念
一.向量(续)1.大小和容量大小:容器中元素的个数.容量:容器中可容纳元素的个数.size_type size (void) const; // 获取大小void resize (size_type num, value_type const& val = value_type ()); // 改变大小往小改,被裁减掉的元素将被析构.往大改,新增出来的元素将被构造,第二个参数表示初始值.void clear (void); // 清空,相当于resize (0)bool empty (void)
【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用
静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s
STL 容器的概念
STL 容器的概念 在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要. 经典的数据结构数量有限,但是我们常常重复着一些为了实现向量.链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在 细节上有所出入.STL容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模版类,STL容器对 最常用的数据结构提供了支持,这些模板的参数允许我们
T4模板_根据DB生成实体类
为了减少重复劳动,可以通过T4读取数据库表结构,生成实体类,用下面的实例测试了一下 1.首先创建一个项目,并添加文本模板: 2.添加 文本模板: 3.向T4文本模板文件添加代码: <#@ template language="C#" debug="True" hostspecific="True" #> <#@ assembly name="System.Data" #> <#@ assembly
手机模板_苹果风格 iOS7 X3_X3.1版源码
[模板介绍:三十大功能与特性]:0.[具有蓝.橙.绿.宝石绿.青.酷黑.红.玫瑰红.粉红.紫.商务蓝.灰蓝12种配色],支持无限配色扩展! 支持iOS.Android系统,兼容多种移动终端!1.[支持图片墙瀑布][发帖.回帖等上传多张图片].2.[App化处理]让您的网站更像一个独立的App应用!3.[全局侧边栏滑出面板菜单]酷炫时尚,动感十足!4.支持全局页脚.头部固定导航:5.支持帖子列表样式和图文样式浏览:[注意:1.(iOS6版只具有质感蓝.酷炫黑两种配色):2.(iOS6版不支持图片墙
STL模板类--数据结构与算法
STL提供了一些模板类,实现了<数据结构>中的一些数据结构类型 在写代码时用到栈,队列等数据结构时可以充分利用STL模板类,会发现特别好用. 想起C语言中用数组实现栈和队列,简直就是噩梦. C++是世界上最好的语言...(just kidding !!!) 顺序容器:动态数组vector;deque链表list; 关联容器:set/multiset有序值:map/multimap有序键值对 一. 动态数组vector类 1.定义:#include<vector> std::vec
STL学习_配接器篇
STL学习_配接器篇 定义 配接器(Adapter)在STL组件的灵活组合运用功能上,扮演着轴承.转换器的角色.它事实上是一种设计模式.即将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作. 分类 STL所提供的各种适配器中,改变仿函数(functors)接口者,称为function adapter:改变容器(containers)接口者,称为container adapter:改变迭代器(iterators)接口者,称为iterato
【BZOJ1058】【ZJOI2007】报表统计 stl模板
题意题解不多说,以前从来不{屑于}写stl,,今天学一学..我就是来贴一份{banlakeji的}stl模板的. 代码: #include <set> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 501000 #define inf 0x3f3f3f3f using namespace std; int n,m; i