Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 388, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

STL容器归纳

 

分三类:序列容器(vectorlistdeque);容器适配器(queuestackpro_queue); 关联式容器(setmapmultisetmultimap)
一、序列容器:即按顺序排列的容器,但内存块不一定是连续的。

Vector:即动态数组,优点:迭代和索引比较快;缺点:在分配的存储空间用完之后,重新分配的时候,需要把旧存储区的对象拷贝到新存储区(拷贝构造),然后销毁旧存储区中所有对象(调用析构),释放旧存储区内存,这样代价比较低,特别是如果拷贝构造和析构的代价比较大,会影响效率。Vector的内存是连续存储的空间。

List:即双向链表,优点:快速插入和删除(相对于vectordeque),尤其是对象较大时(析构、构造、拷贝构造、赋值操作比较大时),内存中为每个对象的存储器的顶部设置一个前向和后向指针,list的遍历只能从top开始,swap()采用的拷贝方法对两个对象进行交换。Listsort()排序和反转reverse()不需要拷贝,因为它们改变的是链接,即两个指针而非对象本身。如果频繁的遍历,不建议用list

Remove()函数,删除时链表不用排序;merge()合并链表,前提是两个链表要经过排序,新的链表包含了两个链表,并排过序,源链表已经删除,所以对象都已经移到新链表中。

Deque:双端队列,可在队列的两端进行添加和查找,和vector一样有operator[]操作符。但是它的存储空间不一定是连续的,不需要像vector需要分配新的内存空间时要复制和销毁对象,在两端添加未知对象时,dequevector更有效率vector在确定元素对象个数时,更有效率,从vector转换为deque的代价很小

 

二、容器适配器:queue, priority_queuestack,这三种是顺序容器适配器,容器适配器是对已经存在的容器的另一种组织方式(这里可以理解为某种数据结构),所有适配器都定义了两个构造函数:默认构造函数用于创建空对象,而带一个容器参数的构造函数将参数容器的副本作为其基础值;每种容器适配器都有默认的容器,这默认的容器是最明智的实现方式。
默认的stackqueue都基于deque容器实现,而priority_queue则在vector容器上实现。在创建适配器时,通过将一个顺序容器指定为适配器的第二个类型参数,可覆盖其关联的基础容器类型。作用:stack是先进后出的数据结构,默认的是采用deque容器实现,我们也可以采用其他的容器来实现栈,但采用deque是最高效的;但是deque不仅仅用在stack中。
queue则是先进先出的队列priority_queue优先队列与队列的差别在于优先队列不是按照入队的顺序出队,而是按照队列中元素的优先权顺序出队(默认为大者优先,也可以通过指定算子来指定自己的优先顺序)。priority_queue模板类有三个模板参数第一个是元素类型,第二个容器类型,第三个是比较算子。其中后两个都可以省略,默认容器为vector,默认算子为less,即小的往前排,大的往后排(出队时序列尾的元素出队)。定义自己的比较算子一般重载比较运算符。
对于stack要注意的是,如果想要栈顶元素,使用top()比pop()更高效,前者返回的是引用,pop返回的是值,需要调用拷贝构造函数。

三、关联式容器(setmapmultisetmultimap):一般以平衡二叉搜索树作为内部数据结构,尤其是RB-tree(红黑树);主要用在通过键值查找元素;内部通过链表来组织的。
set不区分键值和实值。顾名思义,可以把set当做集合使用,由于set的底层是平衡二叉搜索树,因此其在插入、查询和删除时都是O(lgn)的时间复杂度。set和multiset唯一的不同是,set不允许任何两个元素有相同的值,而multiset允许键值重复。set的迭代器本质上是const_iterator,如果不是,则会破坏RB-tree结构;set的元素有自动排序功能。map同时拥有实值(value)和键值(key),其每一个元素都是pair,pair的第一个元素是键值,第二个元素是实值。map和multimap的区别在于,map不允许两个元素拥有相同的键值,而multimap允许存在重复的键值。迭代器和set的一样。
hash-table(哈希表),以及以之为底层机制而完成的hash-set,hash-map,hash-multiset,hash-multimap等都不是在标准之内的关联式容器。
关联式容器插入和删除比vector 快,里list慢(list采用的线性,),在查找和末尾添加上比vector 慢。查找方面比list快,list要遍历,搜索的时间是跟容器的大小成正比,而关联容器 查找的复杂度基本是Log(N)容器越大,性能越高。





 

posted on 2013-04-08 23:04 Benjamin 阅读(424) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理