GeekBand by 494631002
写在前面:笔记我是跟着视频所讲的内容按照顺序记录的,也不能说是流水账;毕竟对于课程中模糊不清的位置还是添加了一些自己的理解,另外还加了一些自己的实验来验证。最后希望大家能够在互评评论区提交笔记错误之处或者自己的看法和建议,能够帮助我们一同更好的学习!
告别了C++面向对象高级编程之后,我们迎来了由张文杰老师主讲的STL泛型编程课程;
所谓泛型编程,就是使用模板为主要工具来编写程序,模板的好处在于,它无需考虑因为型别(类型)的不同而造成大量重复的代码;
模板有两种类型:类模板、函数模板;由于之前的文章已经介绍,这里就不再赘述了;
自己编程尝试了一下函数模板和类模板:
一、函数模板例子:
结果是:
这说明了可以编译器可以自行推导传入参数的类型;需要注意的是:
函数模板也可以重载,我自己写的例子中也有重载,所有重载的版本的声明必须位于它们被调用的位置之前;
二、类模板例子:
由于类模板包含类型参数,因此又称为参数化的类。如果说类是对象的抽象,对象是类的实例,则类模板时类的抽象,类是类模板的实例。
结果是:
注意:
1.如果在类模板外定义成员函数,应写成类模板形式:
template
函数类型 类模板名 <虚拟类型参数>::成员函数名(函数形参表列){……}
2.除了拷贝构造函数之外,如果在类模板中需要使用到这个类本身,那么应该使用其完整的定义,而不能省略型别T;
3.可能会出现模板里面还有模板的情况,例如:
需要注意的是:红色方块表示空格;如果不加上空格,编译器会认为是‘>>’操作符;
三、泛型编程
泛型编程是一种编程方法。我的理解是,就是“套用”别人已经给你设计好的模板,这个模板包括了具体的算法和数据结构(程序=算法+数据结构);等你使用的时候,直接传入你自己定义的(具体的,特定的)类型就可以了;泛型编程作为一种编程的方法或思维,不依赖与具体的语言。在C++中的泛型是通过模板以及相关性质来表现的。
1.Traits
资料 :Trait (computer programming) - Wikipedia
a traits class is a class template used to associate information or behaviour to a compile-time entity, typically a data type or a constant, without modifying the existing entity. In the C++ programming language, this is normally achieved by defining a primary class template, and creating explicit or partial specializations for the relevant types.
traits class是个类模板,在不修改一个实体(通常是数据类型或常量)的前提下,把属性和方法关联到一个编译时的实体。在c++中的具体实现方式是:首先定义一个类模板,然后进行显式特化或进行相关类型的部分特化。
我的理解是:traits的目的是:让属于同一个概念的、具有不同特性的模型,对外暴露一致的接口。概念特别的抽象。打个比方,traits就像一个萃取机;
traits在很多地方都有用到:
这里我们看一下迭代器中的traits是什么样子的:
我们知道,在STL中,
2.迭代器:
迭代器是一种 Pointer-like class。是指针的泛化。迭代器本身是一个对象。在STL中迭代器是容器与算法之间的接口。在STL中,算法和容器是分离的,而迭代器就是它们之间的粘合剂。
3.容器:
我们所用的常用的数据结构不外乎 array, list, tree, stack, queue, hash table, set, map 等。
课堂总结了很多容器的基本用法,这里就不再总结了,我转载一篇总结得非常不错的一篇文章(from CSDN):STL 源码剖析之四:序列式容器 - longhuihu的专栏 - 博客频道 - CSDN.NET
最后用一张图来概括这些容器的特征:
这篇文章我还会继续更加深入地更新,结合了候捷老师的STL视频,会给出更多的实例进行探索。