您好,欢迎访问三七文档
当前位置:首页 > 医学/心理学 > 药学 > C语言编程必备资料(包括库函数,string类,stl库模板)
主笔:Angel,2016-9-28,当前版本,2.01目录1STL简介2顺序性容器2.1C++VECTOR(向量容器)2.2C++LIST(双向链表)2.3C++DEQUE(双向队列)2.4三者比较3关联容器3.1特点3.2C++SETS&MULTISETS3.3C++MAPS&MULTIMAPS4容器适配器4.1特点4.2C++STACKS(堆栈)4.3C++QUEUES(队列)4.4C++PRIORITYQUEUES(优先队列)5迭代器5.1解释5.2功能特点6C++标准库总结6.1容器6.2算法6.3函数对象6.4迭代器6.5分配器6.6数值1STL简介更加详细的资料C++STL(StandardTemplateLibrary标准模板库)是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如queues(队列),lists(链表),和stacks(栈)等.C++STL提供给程序员以下三类数据结构的实现:标准容器类顺序性容器vector从后面快速的插入与删除,直接访问任何元素deque从前面或后面快速的插入与删除,直接访问任何元素list双链表,从任何地方快速插入与删除关联容器set快速查找,不允许重复值multiset快速查找,允许重复值map一对多映射,基于关键字快速查找,不允许重复值multimap一对多映射,基于关键字快速查找,允许重复值容器适配器stack后进先出queue先进先出priority_queue最高优先级元素总是第一个出列程序员使用复杂数据结构的最困难的部分已经由STL完成.如果程序员想使用包含int数据的stack,他只要写出如下的代码:stackintmyStack;接下来,他只要简单的调用push()和pop()函数来操作栈.借助C++模板的威力,他可以指定任何的数据类型,不仅仅是int类型.STLstack实现了栈的功能,而不管容纳的是什么数据类型.2顺序性容器2.1C++Vector(向量容器)是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector看作动态数组。在创建一个vector后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定也可以由vector默认指定,这个大小即capacity()函数的返回值。当存储的数据超过分配的空间时vector会重新分配一块内存块,但这样的分配是很耗时的,在重新分配空间时它会做这样的动作:首先,vector会申请一块更大的内存块;然后,将原来的数据拷贝到新的内存块中;其次,销毁掉原内存块中的对象(调用对象的析构函数);最后,将原来的内存空间释放掉。如果vector保存的数据量很大时,这样的操作一定会导致糟糕的性能(这也是vector被设计成比较容易拷贝的值类型的原因)。所以说vector不是在什么情况下性能都好,只有在预先知道它大小的情况下vector的性能才是最优的。vector的特点:(1)指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组一样操作,并且可以进行动态操作。通常体现在push_back()pop_back()。(2)随机访问方便,它像数组一样被访问,即支持[]操作符和vector.at()(3)节省空间,因为它是连续存储,在存储数据的区域都是没有被浪费的,但是要明确一点vector大多情况下并不是满存的,在未存储的区域实际是浪费的。(4)在内部进行插入、删除操作效率非常低,这样的操作基本上是被禁止的。Vector被设计成只能在后端进行追加和删除操作,其原因是vector内部的实现是按照顺序表的原理。(5)只能在vector的最后进行push和pop,不能在vector的头进行push和pop。(6)当动态添加的数据超过vector默认分配的大小时要进行内存的重新分配、拷贝与释放,这个操作非常消耗性能。所以要vector达到最优的性能,最好在创建vector时就指定其空间大小。Vectors包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。1.Constructors构造函数vectorintv1;//构造一个空的vectorvectorintv1(5,42);//构造了一个包含5个值为42的元素的Vector2.Operators对vector进行赋值或比较C++Vectors能够使用标准运算符:==,!=,=,=,,和.要访问vector中的某特定位置的元素可以使用[]操作符.两个vectors被认为是相等的,如果:1.它们具有相同的容量2.所有相同位置的元素相等.vectors之间大小的比较是按照词典规则.3.assign()对Vector中的元素赋值语法:voidassign(input_iteratorstart,input_iteratorend);//将区间[start,end)的元素赋到当前vectorvoidassign(size_typenum,constTYPE&val);//赋num个值为val的元素到vector中,这个函数将会清除掉为vector赋值以前的内容.4.at()返回指定位置的元素语法:TYPEat(size_typeloc);//差不多等同v[i];但比v[i]安全;5.back()返回最末一个元素6.begin()返回第一个元素的迭代器7.capacity()返回vector所能容纳的元素数量(在不重新分配内存的情况下)8.clear()清空所有元素9.empty()判断Vector是否为空(返回true时为空)10.end()返回最末元素的迭代器(译注:实指向最末元素的下一个位置)11.erase()删除指定元素语法:iteratorerase(iteratorloc);//删除loc处的元素iteratorerase(iteratorstart,iteratorend);//删除start和end之间的元素12.front()返回第一个元素的引用13.get_allocator()返回vector的内存分配器14.insert()插入元素到Vector中语法:iteratorinsert(iteratorloc,constTYPE&val);//在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器,voidinsert(iteratorloc,size_typenum,constTYPE&val);//在指定位置loc前插入num个值为val的元素voidinsert(iteratorloc,input_iteratorstart,input_iteratorend);//在指定位置loc前插入区间[start,end)的所有元素15.max_size()返回Vector所能容纳元素的最大数量(上限)16.pop_back()移除最后一个元素17.push_back()在Vector最后添加一个元素18.rbegin()返回Vector尾部的逆迭代器主笔:Angel,2016-9-28,当前版本,2.0219.rend()返回Vector起始的逆迭代器20.reserve()设置Vector最小的元素容纳数量//为当前vector预留至少共容纳size个元素的空间21.resize()改变Vector元素数量的大小语法:voidresize(size_typesize,TYPEval);//改变当前vector的大小为size,且对新创建的元素赋值val22.size()返回Vector元素数量的大小23.swap()交换两个Vector语法:voidswap(vector&from);2.2C++List(双向链表)是一个线性链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。它无需分配指定的内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中,并且由指针将有序的元素链接起来。由于其结构的原因,list随机检索的性能非常的不好,因为它不像vector那样直接找到元素的地址,而是要从头一个一个的顺序查找,这样目标元素越靠后,它的检索时间就越长。检索时间与目标元素的位置成正比。虽然随机检索的速度不够快,但是它可以迅速地在任何节点进行插入和删除操作。因为list的每个节点保存着它在链表中的位置,插入或删除一个元素仅对最多三个元素有所影响,不像vector会对操作点之后的所有元素的存储地址都有所影响,这一点是vector不可比拟的。list的特点:(1)不使用连续的内存空间这样可以随意地进行动态操作;(2)可以在内部任何位置快速地插入或删除,当然也可以在两端进行push和pop。(3)不能进行内部的随机访问,即不支持[]操作符和vector.at();Lists将元素按顺序储存在链表中,与向量(vectors)相比,它允许快速的插入和删除,但是随机访问却比较慢.1.assign()给list赋值语法:voidassign(input_iteratorstart,input_iteratorend);//以迭代器start和end指示的范围为list赋值voidassign(size_typenum,constTYPE&val);//赋值num个以val为值的元素。2.back()返回最后一个元素的引用3.begin()返回指向第一个元素的迭代器4.clear()删除所有元素5.empty()如果list是空的则返回true6.end()返回末尾的迭代器7.erase()删除一个元素语法:iteratorerase(iteratorloc);//删除loc处的元素iteratorerase(iteratorstart,iteratorend);//删除start和end之间的元素8.front()返回第一个元素的引用9.get_allocator()返回list的配置器10.insert()插入一个元素到list中语法:iteratorinsert(iteratorloc,constTYPE&val);//在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器,voidinsert(iteratorloc,size_typenum,constTYPE&val);//定位置loc前插入num个值为val的元素voidinsert(iteratorloc,input_iteratorstart,input_iteratorend);//在指定位置loc前插入区间[start,end)的所有元素11.max_size()返回list能容纳的最大元素数量12.merge()合并两个list语法:voidmerge(list&lst);//把自己和lst链表连接在一起voidmerge(list&lst,Compcompfunction);//指定compfunction,则将指定函数作为比较的依据。13.pop_back()删除最后一个元素14.pop_front()删除第一个元素15.push_back()在list的末尾添加一个元素16.push_front()在list的头部添加一个元素17.rbegin()返回指向第一个元素的逆向迭代器18.remove()从list删除元素语法:voidremove(constTYPE&val);//删除链表中所有值为val的元素19.remove_if()按指定条件删除元素20.rend()指向list末尾的逆向迭代器21.resize()改变list的大小语法:voidresize(size_typenum,TYPEval);//把list的大小改变到num。被加入的多余的元素都被
本文标题:C语言编程必备资料(包括库函数,string类,stl库模板)
链接地址:https://www.777doc.com/doc-2909119 .html