模板与STL学习简单的笔记
C/C++是一种静态编程语言,必须需要把代码翻译成可执行的二进制可执行程序然后再运行,一旦编译好之后就不能再变了(数据类型也就必须确定下无法更改,因此要为每一种数据类型编写一份算法,工程量巨大)。
void qsort(void *base, size_t nmemb, size_t size,int(*compar)(const void *, const void *));
template <typename T,typename M>
T max(T num1,M num1)
{
return num1>num2?num1:num2;
}
T被称作模板的类型参数,可以叫任何名字,只是俗成约定叫作T。
它指的是函数调用时的任何类型的参数。
虽然模板的类型可以是任意的,但是必须要支持模板函数中所使用到的运算符,因此模板不是成能的,虽然能带来很多好处,但也带来了很多问题。
1、模板的实例化
编译器不会把函数模板编译成一个实例,而是根据调用时的参数,再进行实例化(进一步生成二进制指令)。
模板只有在调用时才会实例化,因此模板编译正确并不代码没有问题,很多错误会产生于调用时。
第一次是检查模板的语法,第二次编译是根据调用参数把模板实例化出来然后再检查运算符是否支持这种类型。
a、使用函数模板时可以根据参数的类型来推断模板的参数
1、默认值什么放在右边
2、C++标准才支持:-std=c++0x
1、同一种格式的函数和函数模板是可以共生,但优先调用普通函数,但可以有函数名后添加一个空的<>指定调用函数模板,模板参数根据调用时的参数推断。
2、普通函数在调用时可以进行类型提升,但是这种提升的结果要低于模板的实例化。
a、类模板的语法
类模板的参数可以在类中当作类型使用,可以定义成员、返回值、参数等。
template<class T,class A,class B,...>
class className
{
C c;
public:
T func(A a);
};
注意:typename也可以继续使用,但大多用class以示区别。
类模板必须要经过实例化才能使用,也是需要经过两次编译,第一次是把类模板编译成一个"套路",这个过程是为了检查语法,第二次是根据实例化参数,生成一个类,然后才能使用这个类创建对象。
className<type1,type2,...> a;
template<class T> int MyStack<T>::num = 10;
静态成员必须在类模板实例化之后才被真正定义出来,每个实例化的类都有和份静态成员,这个实例化类创建出的对象共用一个静态成员。
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、类模板后面的参数可以调用前面的参数。
注意:只能是常量才能进行实例化。
模板与STL学习简单的笔记的更多相关文章
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- 标准模板库(STL)学习探究之stack
标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string
- 标准模板库(STL)学习指南之sort排序
对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算法也基本固定下来,不需要你再去花费心思 ...
- 标准模板库(STL)学习指南之List链表
本文转载自天极网,原文地址:http://www.yesky.com/255/1910755.shtml.转载请注明 什么是STL呢?STL就是Standard Template Library,标准 ...
- 标准模板库(STL)学习指南之priority_queue优先队列
转载自CSDN博客:http://blog.csdn.net/suwei19870312/article/details/5294016 priority_queue 调用 STL里面的 make_h ...
- 标准模板库(STL)学习指南之set集合
set是关联容器.其键值就是实值,实值就是键值,不可以有重复,所以我们不能通过set的迭代器来改变set的元素的值,set拥有和list相同的特性:当对他进行插入和删除操作的时候,操作之前的迭代器依然 ...
- 标准模板库(STL)学习指南之map映射
转载自CSDN博客:http://blog.csdn.net/bat603/article/details/1456141 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关 ...
- 标准模板库(STL)学习指南之vector向量
vector – 一. vector可以模拟动态数组 – 二. vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public 拷贝构造函数和重载的赋值操作符) 三.必须包含的头文 ...
- 标准模板库(STL)学习探究之Multimap容器
C++ Multimaps和maps很相似,但是MultiMaps允许重复的元素.(具体用法请参考map容器) 函数列表: begin() 返回指向第一个元素的迭代器 cle ...
随机推荐
- 笛卡尔积算法的sku
1.笛卡尔积在形式上比较容易理解,但作为按钮操作DOM的时候,我的思路大体还可以,有些偏差.看到这种矩行方阵,首先联想到二维数组,事实上这种方法完全可以实现,但是在性能和编码速度上都有弊端. 2.以下 ...
- 微服务Kong(九)——认证参考
客户端访问上游API服务,通常由Kong的认证插件及其配置参数来控制. 通用认证 一般情况下,上游API服务都需要客户端有身份认证,且不允许错误的认证或无认证的请求通过.认证插件可以实现这一需求.这些 ...
- 如何写一个拼写检查器-by Peter Norvig
本文原著:Peter Norvig 中文翻译:徐宥 上个星期, 我的两个朋友 Dean 和 Bill 分别告诉我说他们对 Google 的快速高质量的拼写检查工具感到惊奇. 比如说在搜索的时候键入 ...
- WPF根据ScrollViewer的滚动条出现与否来设置触发器Trigger
先看一段代码 <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource ...
- mysql和mysql jdbc连接器mysql-connector-java对应关系
mysql和mysql jdbc连接器mysql-connector-java对应关系,请参考下图:来源于mysql官网
- TCP三次握手/四次挥手
TCP 三次握手 TCP 连接是通过三次握手进行初始化的.三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.以下步骤概述了通常情况下客户端计算机联系服务器计算机的过程: 1. ...
- jquery.dataTables动态列--转
转自 https://www.cnblogs.com/lyeo/p/4765514.html jquery.dataTables 版本1.10.7 直接上代码: 0.table <table ...
- The best career advice I’ve received --转载
http://www.nczonline.net/blog/2013/10/15/the-best-career-advice-ive-received/ The best career advice ...
- elasticsearch插件的开发--计算特征向量的相似度
目录 更改elasticsearch的score评分 插件源码解读 脚步一 脚本二(fast-vector-distance) 部署 测试 创建索引 查询 版本说明 项目详细见github 参考文献 ...
- PHP中关于时间(戳)、时区、本地时间、UTC时间等的梳理
PHP中关于时间(戳).时区.本地时间.UTC时间等的梳理 在PHP开发中,我们经常会在时间问题上被搞糊涂,比如我们希望显示一个北京时间,但是当我们使用date函数进行输出时,却发现少了8个小时.几乎 ...