资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,传智播客,cpp,语言入门教程(,12,),讲师:尹成,QQ:77025077,博客,:泛型,导入,面向过程(,Procedure-Oriented),的抽象,抽象出,Procedure(Function),的概念,把程序分成若干个子过程。将事物的方法隐藏于各个函数内,C,语言。,适用于处理小型的程序。对大型程序,子程序之间关系复杂,不易处理变化的需求引发软件危机的原因需要新的抽象。,耦合度,变化总是存在的,导入,面向过程示例,调用子过程时不用考虑其实现细节。,导入,基于对象(,Object-Based),的抽象,引入抽象数据类型(,ADT,Abstract Data Type)。C+,的类,将事物的属性与方法紧密地结合在一起,VB、,带类的,C。,与面向过程相比,可以更好地处理变化,一定程度上化解了软件危机。但各个类之间的关系不容易处理,而且程序代码数量比面向过程时更大需要新的抽象。,导入,示例,Person,是一个抽象数据类型,强内聚,低耦合。,导入,面向对象(,Object-Oriented),的抽象,抽象出封装、继承、多态(,polymorphic),的概念,。,与基于对象相比,有更多的间接性。运用多态,我们可以调用某种方法,而不用指定此方法所属的类型。因而达到更进一步的抽象性。,它为我们带来了什么?,MFC(,用面向对象技术封装,WindowsAPI,,抽象出一个类体系),导入,示例,对用户封装了具体的类型,用户只需和抽象类打交道,MFC,类体系图,物体类,窗口类,视图类,边框类,Application Framework,导入,泛型(,Generic),的概念,Generic,是一种抽象 就如,OO,是一种抽象。,还没有语法与之相对应正在开发中。(,Function,、,Class,、D,:public,B),它为我们带来了什么?,STL。,STL,的概念,何为,STL?,STL(Standard Template Library),是,C,标准庫的一部分(80%),是用,C Template,机制来表达泛型的庫。,STL(Standard Template Library),是用泛型技术来设计完成的实例 就如,MFC(Microsoft Foundational Classes),是用面向对象技术来设计完成的实例,STL,的概念,STL,抽象的是什么?,有些算法并不依赖于数据结构的特定实现,而只是依赖于该结构的几个基本的语义属性,.,STL,抽象出这些基本属性(,Concept),,成功的将算法与数据结构分离,在没有效率损失的前提下,得到了及大的弹性。,STL,的概念,示例,用一个泛型算法可以处理多种数据结构。而且在获得,弹性,的同时运行,效率,上和以前相比没有损失。,STL,的组成,六大组件,容器(,Container),算法(,Algorithm),迭代器(,Iterator),仿函数(,Function object),适配器(,Adaptor),空间配制器(,allocator),STL,的六大组件全都是,抽象,出来的,Concepts,STL,的组成,STL,在哪里?,后缀名?,Namespace,std,定义并初始化一个,list,容器,对区间内每个元素调用传入的操作,pfi,Copy,是一个泛型算法,它将文件中的内容显示到屏幕上,相关资料,STL,之父访谈录 详细介绍了,STL,的历史,点明了,STL,的设计宗旨以及它与,OO,的关系。,复习,C+Template,机制。,习题:,STL example1、STL example2,新的语言特性,Namespace(,名字空间),Template,的新特性,新的类型转换运算符,命名空间(,Namespace),现在的软件多以程序庫、模块、组件拼凑而成,名称冲突问题越来越严重。,Namespace,就是用来解决此问题的。,Namespace,将不同的标识符号集合在一个具体的名称范围内。,命名空间(,Namespace),Namespace,的名字和标识符号间以:分隔(类似于,Class,与,members,之间),命名空间(,Namespace),与类不同的是,,Namespace,是开放的。,可以在不同模块之间定义和扩展,namespace。,因此可以用,namespace,来定义模块、程序庫或组件。,命名空间(,Namespace),using declaration,,我们可以避免一再写出冗长的,namespace,名称,using directive,这就是一个,using declaration,,,它使,I,成为当前范围内代表,Renwind:I,的同义词。,这就是一个,using directive,,它使,Renwind,内的所有名字曝光。,命名空间(,Namespace),using directive,会再度引发名称冲突,调用哪一个,i,呢?,这种写法只适用于写示例程序或相对小的程序,Template,的新特性,类模板显示特化(,class template explicit specialization,),Template,的新特性,类模板偏特化(,class template partial specialization,),Template,的新特性,默认模板参数,根据前一个模板参数,T,,设定下一个模板参数,Template,的新特性,成员模板(,member template,),模板类的成员函数可以是一个模板,Template,的新特性,关键字,typename,做为类型前的标识符号。,指出,SubType,是,T,中定义的一个类型,因此,ptr,是一个指向,T:SubType,的指针。,如果不加,typename,,表达式被认为是,T,中的静态成员,SubType,和,ptr,的乘积。,Template,的新特性,关键字,typename,C,的一般规则是,除了以,typename,修饰以外,,template,内的任何标识符号都被视为一个值(,value),,而非一个类型(,type)。,typename,的第二个作用:在模板声明中替换关键字,class。,新的类型转换运算符,static_cast,只有当类型转换有所定义,整个转换才会成功。,由,float,转换到,int,有所定义,由,char*,转换到,string,有所定义,新的类型转换运算符,dynamic_cast,将多态类型向下转型(,downcast,),为其实际类型,多态类型,运行期进行检验,新的类型转换运算符,const_cast、reinterpret_cast,C,语言中的转型(用小圆括号)可,替换,dynamic_cast,之外的其它三种类型。也因此无法明确显示使用它的确切理由。,新的转型操作符给了编译器更多信息,让编译器清楚知道转型的理由。,Container(,容器),容器的概念,用来管理一组元素。,Container(,容器),容器的分类,序列式容器(,Sequence containers),每个元素都有固定位置取决于插入时机和地点,和元素值无关。,vector、deque、list,关联式容器(,Associated containers),元素位置取决于特定的排序准则,和插入顺序无关,set、multiset、map、multimap,序列式容器,Vectors,将元素置于一个动态数组中加以管理。,可以随机存取元素(用索引直接存取)。,数组尾部添加或移除元素非常快速。但是在中部或头部安插元素比较费时。,序列式容器,Vectors,示例,用,vector,前,必须包含头文件,序列式容器,Deques,deque,,是,“,double-ended queue,”,的缩写。,可以随机存取元素(用索引直接存取)。,数组头部和尾部添加或移除元素都非常快速。但是在中部或头部安插元素比较费时。,序列式容器,Deques,示例,用,deque,前,必须包含头文件,序列式容器,Lists,双向链表。,不提供随机存取(按顺序走到需存取的元素,,O(n),)。,在任何位置上执行插入或删除动作都非常迅速,内部只需调整一下指针。,序列式容器,Lists,示例,用,list,前,必须包含头文件,迭代器(,Iterator),简述,指针与数组,指针与其它数据结构呢?比如说链表?,存储空间是非连续的。不能通过对指向这种数据结构的指针做累加来遍历。,能不能提供一个行为类似指针的类,来对非数组的数据结构进行遍历呢?这样我们就能够以同样的方式来遍历所有的数据结构(所有容器)。,用指针遍历数组,迭代器(,Iterator),简述,迭代器与容器,通过迭代器,我们可以用相同的方式来访问、遍历容器。,每种容器都必须提供自己的迭代器,容器提供一些函数以获得迭代器并以之遍历所有元素。,用迭代器遍历容器,泛型抽象,迭代器(,Iterator),简述,迭代器的概念,迭代器是一个,“,可遍历,STL,容器内全部或部分元素,”,的对象。,一个迭代器指出容器中的一个特定位置。,具有遍历复杂数据结构的能力。,迭代器(,Iterator),简述,迭代器的基本操作,用法和指针一样,其实指针就是一种迭代器,运算符重载,迭代器(,Iterator),简述,迭代器示例,关联式容器,Sets/Multisets,内部的元素依据其值自动排序,Set,内的相同数值的元素只能出现一次,,Multisets,内可包含多个数值相同的元素。,内部由二叉树实现,便于查找。,关联式容器,Sets/Multisets,用,set/multiset,前,必须包含头文件,不能用,push_back,因为是自动排序的。,关联式容器,Maps/Multimaps,Map,的元素是,成对,的键值/实值,内部的元素依据其值自动排序。,Map,内的相同数值的元素只能出现一次,,Multimaps,内可包含多个数值相同的元素。,内部由二叉树实现,便于查找。,关联式容器,Maps/Multimaps,用,map/multimap,前,必须包含头文件,便捷函数,,,返回一个,pair,对象,容器的共通能力,所有容器提供的都是,value,语意,而非,reference,语意。容器执行插入元素的操作时,内部实施拷贝动作。所以,STL,容器内存储的元素必须能够被拷贝(必须提供拷贝构造函数)。,每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。,通常,STL,不会丢出异常。要求使用运行者对确保传入正确的参数。,容器的共通操作,初始化每个容器都提供了一个默认构造函数,一个拷贝构造函数,以某个数组的元素为初值完成初始化。,以某个容器的元素为初值完成初始化。,容器的共通操作,与大小相关的操作函数,返回迭代器的函数,容器的共通操作,比较操作,Vector,容器详解,大小(,Size),和容量(,Capacity),capacity(),,传回,vector,能够容纳的元素个数。,size(),,传回,vector,内现有元素的个数。,如果,capacity,不够用,则重新分配内存,使和,vector,相关联的,pointer,reference,iterator,全部失效。,很费时间。,Vector,容器详解,赋值操作,元素存取,Vector,容器详解,插入和删除操作,各个容器的使用时机,Iterator(,迭代器),迭代器的作用,能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来。,重载了,!,运算符。用以操作复杂的数据结构。,容器提供迭代器,算法使用迭代器。,Iterator(,迭代器),一个简单的例子,容器,提供,迭代器,算法,使用,迭代器,Iterator(,迭代器),迭代器的分类,不同容器提供自己的迭代器,所以不同迭代器具有不同的能力。,不同的算法需要不同的迭代器的能力;相同的算法需要根据迭代器的能力不同而做相应的优化。,Vector,的内部是数组,List,的内部是双向链表,因此,List,提供了自己的,sort,成员函数,Iterator(,迭代器),迭代器的分类,read only,不能改变,iterator,所指对象,write only,单向迭代器,,iter+,双向迭代器,,iter+、iter-,所有指针的运算能力,,p+n,p-n,pn,p1-p2,p1p2,Iterator(,迭代器),一个例子,advance(),Iterator(,迭代器),迭代器的相关类型,有些算法内部需要用到迭代器所代表元素的类型,这个就是迭代器的相关类型。,迭代器的,traits,编程技法,用来扩充容器与算法。,Iterator adaptor(,迭代器配接器),概念,提供和,iterator,相同的接口,但是改变内部的实现方法。,分类,Insert iterator,Stream iterator,Reverse iterator,接口还是迭代器的接口,前缀描述了迭代器的内部实现,Iterator adaptor(,迭代器配接器),Insert(,安插型),iterator,设计模式,尽管,Alexander,所指的是城市和建筑模式,但他的思想也同样适用于面向对象设计模式。只是在面向对象的解决方案里,我们用对象和接口代替了墙壁和门窗。两者的核心都在于提供了相关问题的解决方案。,Gang of Four,,设计模式,Iterator,与,adaptor,是设计模式中的两种。,设计模式,管理模式,Don S.Olson,Carol L.Stimmel,The Manager Pool,分析模式,Martin Fowler,Analysis Patterns,设计模式,实现模式,Scott Meyers,Effective C+,重构模式,Martin Fowler,Refactoring,设计模式,我们需要这样一种语言:它让我们高效地交流、讨论那些常见的、重复出现的设计概念,并在这些概念上建立起我们的系统。,不要仅仅把模式当作解决方案,而要把它们当作设计的词汇,这些词汇可以根据一定的规则组合起来形成句子(也就是系统设计)。,Brandon Goldfedder,,模式之乐,Iterator,模式,定义:提供一种方法,使用按顺序访问某个容器所含的各个元素,而无需曝露该容器的内部表述方法。,Adaptor,模式,定义:将一个类的界面转换为另一个类的界面,使原本因界面不相容而不能合作的,classes,,可以一起运作,。,Adaptor,模式,在,STL,中,改变,iterator,界面的叫做,iterator adaptor,改变,container,界面的叫做,container adaptor,,改变,function object,界面的叫做,function adaptor,Container Adaptor,STL,提供的另两种容器,queue、stack,,其实都只不过是一种,adaptor,,它们简单地修饰,deque,的界面而成为另外的容器类型,STL,的源码,Algorithm(,算法),泛型算法通则,所有算法的前两个参数都是一对,iterators:first,last),,用来指出容器内一个范围内的元素。,每个算法的声明中,都表现出它所需要的最低层次的,iterator,类型。,Algorithm(,算法),泛型算法通则,大部分算法都可以用,functioin object,来更改准则。,function object,又称,functor。,Algorithm(,算法),算法列表,70个,Algorithm(,算法),算法列表,Algorithm(,算法),算法列表,Algorithm(,算法),算法列表,Ending and Begining,总论:,大局观:泛型程序设计与,STL,参考手册,C+,标准程序库,MSDN,Ending and Begining,Ogre,引擎,大量运用,STL,大量运用,OOA、OOD,设计模式,图形,API,图形学算法,ActiveX,控件、,COM,网络支持,传智播客创始人张孝祥老师的理念就是帮助每一位学员都成功。帮助每一位学员都少走弯路。,C,语言,C+,语言,高薪就业,谢谢!,传智播客,
展开阅读全文