- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
面向对象的程序设计泛型编程风格——STL容器和泛型算法 华中科技大学CAD中心 主要内容 2.1 泛型指针 2.2 容器的共同操作 2.3 序列容器 2.4 关联容器 2.5 泛型算法 2.6 STL小结 2.7 其他 概念:程序=数据结构+算法 STL = 抽象容器 + 泛型算法 抽象容器:包括vector, list, deque, set/multiset, map/multimap, hash_map等,其中vector, list,deque等是序列式容器,set, map为关联式,使用关键字进行索引查询 泛型算法:针对不同容器进行的公共操作行为。它是通过函数模板或对象模板技术实现与数据类型和容器类型无关的操作 迭代器:实现容器与算法的连接,也称泛型指针,指向容器中的元素 2.1.1 指针的算术运算 V2: 从一个地址到另一个地址之间进行查找(不用size) 指针算术运算的适用范围 内存空间中连续的数据结构 数组array 向量vector,如find(v1[0], v1[10], v1[5]); 对于list, map等其他的容器不适合!!! 那么,我们如何设计适合所有容器的泛型算法呢? 2.1.2 泛型指针-迭代器 对于不同的容器,各自有这样的泛型指针 则,只需要定义这些对象的(*, !=, ++; 还有==,+等操作符函数),就可以统一方式遍历容器的各元素 Vector的迭代器 改进Find()函数 2.2 容器的共同操作 Vector, list, map, set, queue, deque, stack 包括string类 容器的共同操作 2.3 序列式容器 逻辑上排列有序的容器: Vector List Deque Queue Stack vector template class Type, class Allocator = allocatorType class vector Header vector vector pointer指针 vectorint::pointer ptr = v[0]; cout *ptr endl; ptr++; cout *ptr endl; *ptr = 44; cout *ptr endl; at () vector int v1; v1.push_back( 10 ); v1.push_back( 20 ); const int i = v1.at( 0 ); int j = v1.at( 1 ); Vector特点 动态性,单向线性,连续性[] vector 表示一段连续的内存区域,每个元素被顺序存储在这段内存中。对vector 的随机访问比如先访问元素5 然后访问15 然后再访问7 等等效率很高。 但是在任意位置而不是在vector 末尾插人元素则效率很低,因为它需要把待插入元素右边的每个元素都拷贝一遍。 类似地删除任意一个而不是vector的最后一个元素效率同样很低。因为待删除元素右边的每个元素都必须被复制一遍。这种代价对于大型的复杂的类对象来说尤其大。 deque template class Type, class Allocator=allocatorType class deque Header: deque 接口同 vector Deque特点 同vector,支持[ ], 双向性 一个deque 也表示一段连续的内存区域,但是与vector 不同的是它支持高效地在其首部插入和删除元素。它通过两级数组结构来实现。一级表示实际的容器,第二级指向容器的首和尾。 list template class Type, class Allocator=allocatorType class list Header: list merge, reverse, unique, remove, remove_if List::merge List特点 非连续,双向链表 list 表示非连续的内存区域并通过一对指向首尾元素的指针双向链接起来。从而允许向前和向后两个方向进行遍历。在list 的任意位置插入和删除元素的效率都很高,指针必须被重新赋值但是不需要用拷贝元素来实现移动; 另一方面它对随机访问的支持并不好,访问一个元素需要遍历中间的元素,另外每个元素还有两个指针的额外空间开销。 Queue特点 FIFO 加入队列尾部(push) 出队列(pop) 获得队前元素(front) 获得队尾元素(back) Stack特点 FILO-先进后出 压元素入栈push 获得顶元素top 弹出栈顶元素pop 使
文档评论(0)