您好,欢迎访问三七文档
C++标准程序库Template(模板)使用模板的目的就是能够编写与类型无关的代码,通常模板有两种形式:函数模板和类模板。函数模板针对仅参数类型不同的函数。格式如下:templateclass形参名,class形参名,…返回类型函数名(参数列表){…}类模板针对仅数据成员和成员函数类型不同的类。templateclass形参名,class形参名,…class类名{...};Template(模板)Template,是针对“一个或多个尚未明确的型别”所撰写的函数或类别,可以显示或隐式地将型别当作参数来传递。TemplateclassTinlineconstT&max(constT&a,constT&b){//ifabthenusebelseuseareturnab?b:a;}型别可以是class或typename。通过关键字explicit的作用,可以禁止“单参数构造函数”被用于自动型别转换。Template(模板)非模板型别参数(NontypeTemplatesParameters)bitset32flags32//bitsetwith32bitsbitset50flags50//bitsetwith50bits缺省模板参数(DefaultTemplateParameters)templatetypenameT,typenamecontainer=vectorTclassMyClass;MyClassintX1;//equivalenttoMyClassint,vectorint关键字typenametemplatetypenameTclassMyClass;Template(模板)成员模板(NumberTemplate)classMyClass{templatetypenameTvoidf(T);};NestedTemplateClassestemplatetypenameTclassMyClass{templatetypenameT2classNestedClass;};StandardExceptionClassesSTL效率重于安全StandardExceptionClasses异常类别的头文件#includeexception//forclassesexceptionandbad_exception#includestdexcept//formostlogicandruntimeerrorclasses#includesystem_error//forsystemerrors(sinceC++11)#includenew//forout-of-memoryexceptions#includeios//forI/Oexceptions#includefuture//forerrorswithasync()andfutures(sinceC++11)#includetypeinfo//forbad_castandbad_typeidClassauto_ptrauto_ptr是一种智能型指针(smartpointer),帮助程序员防止“被异常抛出时发生资源泄漏。”auto_ptr是“它所指向的对象”的拥有者。auto_ptrs之间不能共享拥有权。auto_ptrs不满足STL容器对其元素的要求。auto_ptr在copy和assign动作之后,原本的auto_ptr会交出拥有权,而不是copy给新的auto_ptr。NumericLimits(数值极限)C++Standard规定了各种型别必须保证的最小精度。相关头文件为#includelimits。AuxiliaryFunctions(辅助函数)算法程序库(定义于头文件algorithm)内提供从两个或多个数值之间挑选较小值和较大值。两值互换:函数swap()用来交换两对象的值,其泛型化版本定义于algorithm。辅助性的比较操作符,定义于utility。比较操作符有:!=,,=,=,==,。其中!=,,=,=都是利用==,完成的。STL组件Container(容器),用来管理某类对象的集合。Iterators(迭代器),用来在一个对象群集的元素上进行遍历动作。Algorithms(算法),用来处理群集内的元素。STL的一个根本特性是所有组件都可以针对任意型别运作。STL甚至提供更泛型化的组件,通过特定的配接器(adapters)和仿函数(functors,或称functionobject),可以补充、约束或定制算法,以满足特别需求。STL组件STL的基本观念就是将数据和操作分离。数据由容器类别加以管理,操作则有可定制的算法定义。迭代器在两者之间充当粘合剂,使任何算法都可以和任何容器交互运作。Containers(容器)容器类别(简称容器),用来管理一组元素。SequenceContainers(序列式容器)序列式容器,是可序群集,其中每个元素均有固定位置——取决于插入时机和地点,和元素值无关。容器类别元素管理方式允许操作头文件Arraysstaticarrayrandomaccess;修改元素值;arrayVectorsdynamicarrayrandomaccess;在末端添加、删除元素;vectorDequesdynamicarrayrandomaccess;在头尾添加、删除元素;dequeListsdoublylinkedlist任何位置的安插、删除listsinglylinkedlistforward_listAssociativeContainers(关联式容器)关联式容器依据特定的排序准则,自动为其元素排序。排序准则以函数形式呈现,用来比较元素值(value)或元素键(key)。缺省情况下以operator进行比较(注:operator等同于less,若是使用greater,则需引用头文件functional)。排序准则同时也用来测试互等性:如果每个元素都不小于对方,则两者被视为相等(注:对于float/double的元素,需要用绝对值小于0.0…1)。关联式容器通常由binarytree(二叉树)实作出来。Sets/Multisets:元素按其值自动排序,set不允许重复,而multiset可包括多个数值相同的元素。Maps/Multimaps:元素都是key/valuepairs,每个元素有一个键,是排序准则的基础。map不允许其键值重复。UnorderedContainers(无序式容器)hashtableContainersAdapters(容器配接器)Stacks对元素采取LIFO(后进先出)管理策略Queues对元素采取FIFO(先进先出)管理策略,也就是说,它是个普通的缓冲区。PriorityQueues容器中的元素可以拥有不同的优先权。所谓优先权,乃是基于程序员提供的排序准则(缺省使用operator)而定义。Priorityqueue的效果相当于这样一个buffer:“下一元素永远是queue中优先级最高的元素。”如果同时有多个元素具备最高优先权,则其次序无明确定义。Iterators(迭代器)迭代器是一个“可遍历STL容器内全部或部分元素”的对象。一个迭代器用来指出容器中的一个特定位置。基本操作如下:Operator*返回当前位置上的元素值,如果该元素拥有成员,则可以以operator-取用它们。Operator+将迭代器前进至下一元素。大多数迭代器还可使用operator–退回前一个元素。Operator==和Operator!=判断两个迭代器是否指向同一位置。Operator=为迭代器赋值(将其所指元素的位置赋值过去)。Iterators(迭代器)迭代器是个所谓的smartpointers,具有遍历复杂数据结构的能力。其下层运行机制取决于其所遍历的数据结构。因此,每一种容器型别都必须提供自己的迭代器。采用pre-increment或pre-decrement操作符。IteratorsCategories(迭代器分类)Bidirectionaliterators(双向迭代器):list,set,multiset,map,multimapRandom-assessiterators:具备双向迭代器所有属性,还具备随机访问能力。vector,deque,array,stringsAlgorithms(算法)算法并非容器类别的成员函数,而是一种搭配迭代器使用的全局函数。搭配迭代器使用的一个重要优势:所有算法只需实作出一份,就可以对所有容器运作,不必为每一种容器量身订制。调用算法,需含入头文件algorithm。所有算法都用来处理一个或多个区间(ranges)内的元素。所有算法处理的都是半开区间(half-openranges)——包括起始元素位置但不包括结尾元素位置:[begin,end)如果某个算法用来处理多个区间,当调用时,务必确保第二(以及其它)区间所拥有的元素个数,至少和第一区间内的元素个数相同。IteratorsAdapters(迭代器之配接器)类型说明InsertiteratorsBackinserters内部调用push_back(),对vector,deque,list,strings有效Frontinserters内部调用push_front(),对deque,list,forward_list有效Generalinserters内部调用inert(),对所有容器都有效Streamiterators(流迭代器)istream_iteratorT(cin)读入T类型;istream_iteratorT()产生一个“流结束符”;ostream_iteratorT(cout)标准读出Reverseiterators(逆向迭代器)逆向遍历MoveiteratorsC++11ManipulatingAlgorithms(更易型算法)Remove(iter_begin,iter_end,value)删除某个区间的元素,但是不会改变该群集的元素数量。coll.erase(remove(coll.begin(),coll.end(),value),coll.end())删除区间里的元素,同时会改变元素数量。关联式容器的所有迭代器均被声明为指向常量(不变量),如果你更易关联式容器和UnorderedContainers容器中的元素,会导致编译错误。成员函数会提高程序运行效率。FunctionObjects(仿函数)一个行为类似函数的对象。所谓函数行为,是指可以“使用小括号传递参数,藉以调用某个东西。”仿函数的优点:仿函数是“smartfunctions”,可有用成员函数和成员变量;仿函数有自己的型别;仿函数通常比一般函数速度快。调用时需包含头文件functionalRequirementforContainerElements容器元素的三个基本要求:必须是可copyable或者movable,copy构造函数必须是副本和原本相等;必须可透过assignment操作符完成赋值动作;必须可透过析构函数完成销毁动作。其它要求:对序列式容器而言,元素的default构造函数必须可用;对于某些动作,必须定义operator==以执行相等测试,特别是有搜索需求时;在关联式容器中,元素必须定义出排序准则,缺省情况下是operator。ErrorHandling(错误处理)使用STL时,必须满足以下要求:迭代器务必合法而有效;一个迭代器如果指向“逾尾(post-the-end)”位置,它并不指向任何对象;区间必须是合法的;如果涉及的区间不止一个,第二区间及后继各区间必须拥有“至少和第一区间一样多”的元素;覆盖(overwritten)动作中的
本文标题:C++标准程序库
链接地址:https://www.777doc.com/doc-3972283 .html