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

         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源码剖析》是一本关于STL(标准模板库)的学习笔记。这本书深入解析了STL的实现原理和设计思路,对于理解STL的内部机制和使用方法非常有帮助。这些学习笔记记录了作者在学习侯捷的《STL标准库和泛型编程》课程时的心得和总结,对于理解STL源码和进行泛型编程都具有指导意义。 这本书涉及了STL的各个模块,包括容器、迭代器、算法等,并解释了它们的实现原理和使用方法。通过学习这本书,你可以更好地理解STL的底层实现和使用技巧。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STLSourceAnalysis:stl原始码剖析(侯捷)的学习笔记](https://download.csdn.net/download/weixin_42175776/16069622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [候捷老师STL源码剖析视频课程笔记](https://blog.csdn.net/weixin_46065476/article/details/125547869)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [侯捷——STL源码剖析 笔记](https://blog.csdn.net/weixin_45067603/article/details/122770539)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值