- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2011.1.17STL容器技术交流
STL Standard Template Library(标准模板库) 是参数多态的一种实现方式; 在STL中基本容器主要有:vector、list、deque、set、multiset、map、multimap C++ STL 中标准顺序容器为vector、list、deque C++ STL 中标准关联容器SET、multiset、map、multimap 顺序容器vector、list、deque Vector 数据结构是一变长一维数组; List 数据结构是一个双向链表; Deque 数据结构是一个双端队列。 关联容器SET、multiset、map、multimap C++ STL 中的关联容器SET、multiset、map、multimap内部采用的是一种非常高效的自平衡检索二叉树:红黑树,也称为RB树(Red-Black Tree)。红黑树在统计性能要好于平衡二叉树。 (注记:STL中的关联容器采用的是红黑树,而并不是所有的这种容器都采用红黑树,例如hash_map使用hash表来排列配对 ; 红黑树不是平衡二叉树,红黑树放松了平衡二叉树的某些要求,由于一定限度的“不平衡”,红黑树的性能得到了提升。 ) 红黑树简介 红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 红黑树是二叉查找树,同时由于其性制的限制,其又是接近平衡的。 二叉查找树必须满足以下性质:对于不为空的二叉查找树的一个结点P而言: 如果P为左子树若非空,则左子树上的所有结点的关键字值均小于P结点的关键字值。 如果P的右子树若非空,则右子树上的所有结点的关键字值均大于P结点的关键字的值。 结点P的左右子树同样是二叉查找树。 红黑树是二叉查找树所以同样满足以上性质。 红黑树的性质 红黑树必须满足的性质: 1)每个结点要么是红的,要么是黑的。2)根结点是黑的。3)每个叶结点,即空结点(NIL)是黑的。4)如果一个结点是红的,那么它的俩个儿子都是黑的。5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。 红黑树的性质 红黑树的特性: 红黑树是二叉查找树,所以具有二叉查找树的特性: 执行查找、插入、删除等操作的时间复杂度为O(lgn)。优于一般线性链表的O(n)。 红黑树如下图: 在插入和删除之后,红黑属性可能变得违规。恢复红黑属性需要少量(O(log n))的颜色变更(这在实践中是非常快速的)并且不超过三次树旋转(对于插入是两次)。这允许插入和删除保持为 O(log n) 次,但是它导致了非常复杂的操作。 Map 、set 采用红黑树的数据结构,所以他们的插入、删除效率比其它序列容器高的。因为红黑树插入、删除时不用像vector、string一样进行大量的内存拷贝。 STL 的SET容器 set或multiset是一个按用户指定排序规则将set内的数据进行排序的集合库,所以set的元素必须是可排序的。set内不允许有相同的数据,而multiset允许有重复数据。 SET 采用的是红黑树的数据结构;SET的树内部保持它的元素是有序的。 STL SET是一个集合库在用法上支持交并操作。 SET容器的效率 因为SET是红黑树的数据结构而红黑树又是二叉查找树,所以SET容器的插入、删除和查找元素的时间复杂度为O(lgn)。SET内部元素本身是保持顺序的。 每次插入或删除元素时可能需要一次或多次的旋转操作重构红黑树。 SET容器的使用 定义一个元素为整形的集合a, 代码:setint a; 对集合a中元素的 插入操作:a.insert(1); 删除操作(如果存在):a.erase(1); 判断是否属于集合操作:if(a.find(1)!=a.end())…… 返回集合元素的个数:a.size() 将集合清为空集:a.clear() 集合的并,交和差操作: Set_union(a.begin(),a.end(),b.begin(),b.end(),insert_iteratorsetint(c,c.begin)) 对a,b集合的所有元素进行并运算,并将数据存入C集合中。(C集合前提为空) Set_intersection(a.begin(),a.end(),b.begin(),b.end(),insert_iteratorsetint(c,c.begin)) 对集合a,b中的所有元素进行交运算,将结果的所有数据存入C集合中(前提C集合为空) Set_difference(a.begin(),a.end(),b.begin(),b.end(),insert_iteratorsetint(c,c.begin)) 对集合a,b中的所有元素
文档评论(0)