码迷,mamicode.com
首页 > 其他好文 > 详细

《STL源码剖析》学习笔记(二)

时间:2015-07-29 23:10:38      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:

         STL标准模板库作为C++标准库的一部分,其组件包括:容器、算法、迭代器、仿函数、配接器、配置器。

         今天来说说容器,容器主要可以分为两种:序列式容器(元素是可序的,但并非有序)、关联式容器。

一、序列式容器

     1、vector

     1)vector和C/C++的内置数组类似,只不过array空间是静态的,vector的空间则是可以改变的,当元素个数达到空间上限时,会重新分配空间,进行复制,然后删除原空间数据。

     2)vector占用一段连续的存储空间,其内部含三个指针,分别指向:该连续空间的开头、结尾及目前存放元素空间的结尾。

     3)vector进行元素插入或删除时,可能会引起空间的重新配置,进而使所有的迭代器失效。

     2、list

     1)list底层采用双向循环链表构成,头尾之间有一空白节点,所以迭代器可以前进或后退。

     2)相较于vector,list支持push_front、pop_front

     3)vector和list的选取:当元素插入删除频率,对随机读取要求不高时,选用list;当数据需要频繁读取,且对读取时间效率要求较高时用vector。

     3、slist(single list)

     1)slist底层采用单向非循环链表构成,其迭代器只能前进,进行数据插入时必须要从头节点开始遍历。

     2)为效率考虑,slist只提供push_front、pop_front而没有push_back、pop_back。

     3)slist所占空间相对于list来说较少。

    4、deque

    1)deque是双向开口的连续线性空间,所以同时支持push_front、push_back。

    2)号称连续,但并非真的连续,它仅仅是将多个定量的连续空间连接在一起,所以deque需要一个中控器来维护其整体连续的假象。

    3)主控map是一块连续的空间,和容器一样,当连续空间存放full之后会重新配置一块连续的区域,主控中存放的是一个个指向连续区域的指针,每个区域的大小是固定的,可以由用户指定。deque<int,alloc,n>,n(个)即缓冲区的大小。

    4)deque可以理解为vector和list的结合。

    5、stack、queue

     1)用的比较多的两个容器:栈、队列

     2)stack\queue可以理解为一种配接器,是对其他容器的一种修饰,只支持少数操作,不能遍历。

     3)stack\queue底层的实现可以是deque也可以是list,可以由用户自己指定,默认情况下是deque。

    6、heap

    1)heap与其说是一种容器,其实更多是一种算法,利用其可以对数组或容器进行调整,构建成堆或排序等。

    2)heap要求是完全二叉树,所以可以用数组来存储堆(隐式储存),且heap是一个最大堆。

    3)heap是以算法形式呈现的,它没有迭代器。

    4)主要包括以下算法:

         push_heap(iterator,iterator):以两个迭代器作为参数,当新push_back一个新元素后,调用此函数,使容器仍为最大堆形式。

         pop_heap(iterator,iterator):以两个迭代器作为参数,将堆的根结点放置到容器最后,并保持此前的元素仍为最大堆,即最大pop_heap之后,最大值位于容器的尾部。

         make_heap(iterator,iterator):将两个迭代器之间的元素构建成为最大堆。

         sort_heap(iterator,iterator):将两个迭代器之间的元素进行堆排序。

    7、priority_queue

        1)和之间的stack\queue一样,priority_queue也是采用其他容器配合heap实现,缺省时以vector作为底层实现容器。

        2)priority_queue会在元素插入时进行排序,值最大的放在堆的顶部。

        3)priority_queue不提供遍历功能,只能获取堆顶部元素,即只能由顶部出队列。

        4)queue和priority_queue功能其实相差不大,只不过前者是先进先出,后者是优先级较高的先出,都不提供遍历功能。

二、关联式容器

        关联式容器主要有以下两种:set(集合)和map(映射表)。由二者又衍生出两类:multiset(多键集合)和multimap(多键映射表)。此四者均由红黑树实现。除此之外,还有hash_set\hash_map\hash_multiset\hash_multimap,此四者底层都由哈希表实现。

       1、关联式容器的主要目的是为实现快速读取,红黑树是有序的,所以前者都是自动排序的,而哈希表是无序的,所以后者不能自动排序。

       2、set元素值就是键值,它没有键值和实值的区别,map同时拥有键值和实值。

       3、set\map\hash_set\hash_map都不允许键相同,且键的值是不允许更改的,而multiset\multimap\hash_multiset\hash_multimap是可以的键是可以相同的。

       4、关联式容器都可以利用迭代器进行输出。

    


《STL源码剖析》学习笔记(二)

标签:

原文地址:http://blog.csdn.net/walker19900515/article/details/47132885

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!