STL与泛型编程-第一周笔记-Geekband
来源:互联网 发布:windows xp 美化大师 编辑:程序博客网 时间:2024/05/15 04:33
1, 模板观念与函数模板
简单模板:
template< typename T > T Function( T a, T b) {… }
类模板:
template struct Object{……….};
函数模板
template< class T> inline T Function( T a, T b){……}
不可以使用不同型别的参数来调用函数模板
可以使用class代替typename. 但不能使用struct代替typename
使用具体类型代替模板参数T叫实例化, 从而产生一个模板实例.
模板编译过程:
实际编译两次
1,没有实例化前,检查模板代码本身检查是否有语法错误
2,实例化期间,检查模板代码的调用是否合法
模板编译
1,类型必须严格符合,不可自动型别转换.
2,如果真的要转换,那么需要使用static_cast< …>进行强制转换.
函数模板重载
1, 模板函数可以像普通函数一样被重载
2, 非模板函数可以和同名模板函数共存
3, 编译器通过函数模板参数推导来决定使用哪个重载
其他因素相同的情况下,重载裁决过程调用非模板函数.
(否则编译器还需要自己在实例化一套代码)
Max<>(7,32) 调用Max允许空模板参数
Max(2,3) 显式指定模板实参类型
2, C++类模板
template < typename T, size_t n = 1024> class Stack{……..};
a,关键字 typename 和class 都可使用
b,在模板内, T可以像int,char一样 定义成员变量和成员函数
c,除了Copy constructor之外, 如果在类模板内需要使用到这个类本身,如定义operator=,那麽应该使用其完整定义(Stack)
Stack& operator=( Stack < T,n> const & );
类模板的使用:
1,Stack s;
2,Stack< int,100> s;
1,Stack< Stack > s; 定义一个Stack的Stack , 此处必须有一个空格, 否则编译器会以为是>>操作符
3, 类模板特化
template<>
class Stack{……};
可能可以做些特别的优化或者提供不同的实现
避免在实例化某些类时,引起一些可能产生的诡异行为
4, 类模板偏特化
主模板:
template< typename T1, typename T2> class MyClass{…};
偏特化:
2
template< typename T> class MyClass< T,T>{…};
3
template< typename T> class MyClass< T,int>{…};
4
template< typename T1, typename T2> class MyClass< T1*,T2*>{…};
如果有不止一个偏特化同程度的能匹配某个调用,那么该调用具有二义性,ERROR.
如 :
MyClass< int, int> obj; 满足 MyClass< T,T> 和 MyClass< T,int>
MyClass< int*, int*> obj; 满足 MyClass< T1*,T2* > 和 MyClass< T,T>
5, 默认模板实参
template< typename T, typename Tcons = std::vetor< T> > class Stack{…};
6, 操作符重载
除了 operator= ,其他操作符都可以被重载.
7, 特性(Traits) - 重点
Traits可以实现为模板类, 而关联则是针对每个具体型别T的特化. template< typename T > class Simg{ };template< > class Simg< char>{ public: typedef int ReturnType ;};template< > class Simg< short>{ public: typedef int ReturnType ;};template< > class Simg< int>{ public: typedef long ReturnType ;};
Traits实现: (函数定义)
template< typename T>typename Simg< T >::ReturnType Sigma ( const T const* Start, const T const* end){ Simg< T >::ReturnType type; type r = ReturnType(); return r ; //这里返回的就是特性的新类型}
8, 迭代器
用于分离算法和容器
智能指针
- STL与泛型编程-第一周笔记-Geekband
- GeekBand笔记-《STL与泛型编程 》 第一周
- Geekband STL与泛型编程 第一周作业
- Geekband STL与泛型编程 第一周笔记 暗影行者
- GeekBand笔记-《STL与泛型编程 》 第四周
- GeekBand C++ STL与泛型编程 第五周笔记
- GeekBand C++ STL与泛型编程 第六周笔记
- GeekBand C++ STL与泛型编程 第七周笔记
- GeekBand笔记-《STL与泛型编程 》 第五周
- GeekBand笔记-《STL与泛型编程 》 第二周
- GeekBand笔记-《STL与泛型编程 》 第三周
- 极客班STL与泛型编程 第一周学习笔记
- Boolan STL与泛型编程 第一周笔记
- Boolan STL与泛型编程 第一周笔记
- 《Geekband》STL与泛型编程01
- 《GeekBand》STL与泛型编程02
- 《GeekBand》STL与泛型编程03
- 【GeekBand】第一周课程笔记
- parted命令详解
- [转]JAVA 基本数据类型长度
- 两个Fragment之间参数的传递
- android 的各种文件类
- git不是内部命令
- STL与泛型编程-第一周笔记-Geekband
- HDOJ 1330 Deck(叠木块-物理题啊!贪心算法用到了一点)
- 构造函数的返回值
- 风控评分模型
- Spring-AOP注解与方法规则实例
- 生产者消费者模型(多个生产者和多个消费者)JDK1.5之前实现版
- Linux find --搜索文件
- 将固定的空间添加到window上,并拉起QQ聊天界面
- http协议中:GET/POST/PUT/DELETE/INPUT/TRACE/OPTIONS/HEAD方法