一、如何进行泛型编程
 C/C++是一种静态编程语言,必须需要把代码翻译成可执行的二进制可执行程序然后再运行,一旦编译好之后就不能再变了(数据类型也就必须确定下无法更改,因此要为每一种数据类型编写一份算法,工程量巨大)。
 C语言中的快速排序:
 void qsort(void *base, size_t nmemb, size_t size,int(*compar)(const void *, const void *));
 C++提供了模板的编程方法来解决泛型编程的问题,它的解决思路是,程序员先编写好一份"套路"代码,然后在调用时编译器根据调用时的参数再为这种数据类型生成一份属于的它代码。
二、模板的语法

 template <typename T,typename M>
T max(T num1,M num1)
{
return num1>num2?num1:num2;
}
 练习:使用模板实现出一冒泡排序,能够被所有的数据类型所调用。
 
 T被称作模板的类型参数,可以叫任何名字,只是俗成约定叫作T。
 它指的是函数调用时的任何类型的参数。
 
 虽然模板的类型可以是任意的,但是必须要支持模板函数中所使用到的运算符,因此模板不是成能的,虽然能带来很多好处,但也带来了很多问题。
三、函数模板的使用
 1、模板的实例化
 编译器不会把函数模板编译成一个实例,而是根据调用时的参数,再进行实例化(进一步生成二进制指令)。
 2、使用模板时才实例化。
 模板只有在调用时才会实例化,因此模板编译正确并不代码没有问题,很多错误会产生于调用时。
 3、二次编译
 第一次是检查模板的语法,第二次编译是根据调用参数把模板实例化出来然后再检查运算符是否支持这种类型。
四、函数模板的隐式推断
 a、使用函数模板时可以根据参数的类型来推断模板的参数
 b、当函数模板不能通过函数调用时的参数来推断模板参数时,可以使用<类型,类型...>来明确指定。
 c、函数模板参数是可以有默认值的
  1、默认值什么放在右边
  2、C++标准才支持:-std=c++0x
五、函数模板与普通可以重载(特化)
 1、同一种格式的函数和函数模板是可以共生,但优先调用普通函数,但可以有函数名后添加一个空的<>指定调用函数模板,模板参数根据调用时的参数推断。
 
 2、普通函数在调用时可以进行类型提升,但是这种提升的结果要低于模板的实例化。
 3、函数模板也可以进行类型提升,但如果有一个普通函数也可以进行类型提升调用,那么则优先调用普通函数。
六、类模板
 a、类模板的语法
 类模板的参数可以在类中当作类型使用,可以定义成员、返回值、参数等。

 template<class T,class A,class B,...>
class className
{
C c;
public:
T func(A a);
};

注意:typename也可以继续使用,但大多用class以示区别。

 b、类模板的使用
 类模板必须要经过实例化才能使用,也是需要经过两次编译,第一次是把类模板编译成一个"套路",这个过程是为了检查语法,第二次是根据实例化参数,生成一个类,然后才能使用这个类创建对象。
 使用类模板实例化一个类:
 className<type1,type2,...> a;
 练习:实现栈类模板,成员函数有入栈、出栈、栈空、栈满。
 c、类模板参数不支持隐式推断,必须显示实例化。
 d、静态成员的定义的语法
  template<class T> int MyStack<T>::num = 10;
  静态成员必须在类模板实例化之后才被真正定义出来,每个实例化的类都有和份静态成员,这个实例化类创建出的对象共用一个静态成员。
 e、递归实例化
  MyStack<MyStack<int>> stack;
  尽量不要轻易使用。
七、类模板的特化(重载)
 特化:指的是当类模板有特殊的类型无法处理时,可以为这种特殊类型单独实例化出一个类,这种单独的实现叫作模板的特化。
 全类的第特化:按照类的格式把类完整再实现一遍(重写一遍)。

 template<> class className <char*>
{
...
};
 成员特化:给指定的类型提供一个特殊的的成员函数。

 template<> 返回值 className<char*>::max(void)
{
...
}
 局部特化:可以让用户根据实例化时的参数来指定使用的类模板

 template<class A,class B> class N
{public:N(void){cout <<""<<endl;}};
template<class A> class N <A,A>
{public:N(void){cout <<""<<endl;}};
template<class A> class N <A,short>
{public:N(void){cout <<""<<endl;}};
template<class A> class N <A*,A*>
{public:N(void){cout <<""<<endl;}};
template<class A,class B> class N <A*,B*>
{public:N(void){cout <<""<<endl;}};
 注意:同等程序的特化会引起二义性。
八、类模板的参数
 1、类模板的参数可以有默认值
  注意:使用类模板默认值时,<>不能省略,可以空着,但不能不写。 
 2、类模板后面的参数可以调用前面的参数。
 3、普通数值可以对类模板进行实例化,它必须以类似变量的形式存在。
 注意:只能是常量才能进行实例化。

模板与STL学习简单的笔记的更多相关文章

  1. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

  2. 标准模板库(STL)学习探究之stack

    标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string

  3. 标准模板库(STL)学习指南之sort排序

    对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算法也基本固定下来,不需要你再去花费心思 ...

  4. 标准模板库(STL)学习指南之List链表

    本文转载自天极网,原文地址:http://www.yesky.com/255/1910755.shtml.转载请注明 什么是STL呢?STL就是Standard Template Library,标准 ...

  5. 标准模板库(STL)学习指南之priority_queue优先队列

    转载自CSDN博客:http://blog.csdn.net/suwei19870312/article/details/5294016 priority_queue 调用 STL里面的 make_h ...

  6. 标准模板库(STL)学习指南之set集合

    set是关联容器.其键值就是实值,实值就是键值,不可以有重复,所以我们不能通过set的迭代器来改变set的元素的值,set拥有和list相同的特性:当对他进行插入和删除操作的时候,操作之前的迭代器依然 ...

  7. 标准模板库(STL)学习指南之map映射

    转载自CSDN博客:http://blog.csdn.net/bat603/article/details/1456141 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关 ...

  8. 标准模板库(STL)学习指南之vector向量

    vector – 一.  vector可以模拟动态数组 – 二.  vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public 拷贝构造函数和重载的赋值操作符) 三.必须包含的头文 ...

  9. 标准模板库(STL)学习探究之Multimap容器

    C++ Multimaps和maps很相似,但是MultiMaps允许重复的元素.(具体用法请参考map容器)     函数列表:     begin() 返回指向第一个元素的迭代器      cle ...

随机推荐

  1. 虚拟网络编辑器的知识和出现的一些问题(没有VMnet0或VMnet8)

    不多说,直接上干货! 安装好的虚拟机,没有VMnet0!!! 解决的办法: 就可以了. 那么,问题现在又来了? 但是,每次都要这样,以右键,管理员身份运行,再关闭之后,以普通双击方式,即又没有VMne ...

  2. 分布式处理与大数据平台(RabbitMQ&Celery&Hadoop&Spark&Storm&Elasticsearch)

    热门的消息队列中间件RabbitMQ,分布式任务处理平台Celery,大数据分布式处理的三大重量级武器:Hadoop.Spark.Storm,以及新一代的数据采集和分析引擎Elasticsearch. ...

  3. tomcat与jboss等容器的区别

    1.JBoss 是 J2EE 应用服务器,而 Tomcat 只是一个 Servlet 容器,或者说是一个简单的 J2EE 应用服务器. JBoss 中的 Servlet 容器还是 Tomcat. 与  ...

  4. Linux信号机制代码示例

    1 基本功能: 本Blog创建了两个进程(父子进程): 父进程: 执行文本复制操作,当收到 SIGUSR1信号后,打印出现在文件复制的进度: 子进程: 每个固定时间段向父进程发送一个 SIGUSR1 ...

  5. 我理解的js中预解释

    浏览器在执行代码前,先找带var和带function的地方,把带var的声明且赋予初始值undefined,把带function的声明且定义. 带var关键字预解释 让我们先看下这段代码执行的结果: ...

  6. Dev中控件的js事件代码放在form标签中存在问题

    Dev中控件的js事件代码放在form标签中会获取不到(head标签中有其他js代码,未验证是否是这个问题)

  7. Xshell基础入门

    启动 双击快捷方式,启动 新建回话 建立连接 在这里需要填写的是: 1. 连接名称 2. 服务器IP 3. 服务器端口(默认22) 填写完毕后,点击确定,保存配置,回到连接页面,可以看到多了一个测试服 ...

  8. JavaMelody - 常用配置

    一直没怎么关注javaMelody这个东西. 自己写东西的时候想弄点监控,于是把javaMelody装进去了. 看了文档几乎全是法语,在此记录一些常用的配置. 首先依赖添加如下: <depend ...

  9. MVC 之var与dynamic

    如果你用MVC写过程序,那么你应该知道ViewBag这个用于前后台的数据传递工具,那么你是否对ViewBag的用法感到过疑惑呢? ViewBag.Mode1l=new object(); ViewBa ...

  10. 请整体描述Java异常体系

    java把异常当做对象来处理,并定义一个基类Throwable作为所有异常的超类.在java API中已经定义了许多异常的类,这些异常分为两大类,错误Error和异常Exception.其中异常Exc ...