C++STL

STL 源码剖析

2019-03-11  本文已影响33人  cb_guo

GitHub参考
STL"源码"剖析-重点知识总结
C++STL自己总结

容器(Containers):各种数据结构,如:vector、list、deque、set、map。用来存放数据。从实现的角度来看,STL容器是一种class template。

序列式容器

所谓序列式容器,其中的元素都可序,但未必有序,C++本身内建了一个序列式容器array,STL另外提供了vector、list、deque、stack、queue、priority-queue等序列式容器。其中stack和queue由于只是deque改头换面而来,技术上被归为一种配接器 (adapter)。

vector

vector 采用的数据结构非常简单:线性连续空间。它以两个迭代器 startfinish 分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器 end_of_storage 指向整块连续空间(含备用空间)的尾端。


注意:所谓动态增加大小,并不是在原来空间之后接续新空间(因为无法保证原空间之后尚有可供分配的空间),而是以原来大小的的两倍另外分配一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效啦。

list

相对于vector的连续线性空间,list就显得复杂许多,它的好处就是插入或删除一个元素,就配置或删除一个元素空间。
对于任何位置的元素的插入或删除,list永远是常数时间。
list本身和节点是不同的结构,需要分开设计。以下是STL list的节点node结构:

template <class T>
class __list_node {
    typedef void* void_pointer;
    void_pointer prev;
    void_pointer next;
    T data;
};
这是一个双向链表
SGI list不仅是一个双向链表,而且是一个环状双向链表。只需一个指针就可遍历整个链表。

deque

template <class T, class Ref, class Ptr, size_t BufSiz>
struct __deque_iterator { // 未继承 std::iterator
    // 保持迭代器的连接
    T* cur; // 此迭代器所指之缓冲区的现行( current)元素
    T* first; // 此迭代器所指之缓冲区的的头
    T* last; // 此迭代器所指之缓冲区的的尾(含备用空间)
    map_pointer node; // 指向管控中心
    ...
};

假如deque中已经包含了20个元素了,缓冲区大小为8,则内存布局如下:

stack

queue

heap

priority_queue

slist

关联式容器

标准的 STL 关联式容器分为 set (集合) 和 map (映射表) 两大类,以及这两大类的衍生体 multiset (多键集合) 和 multimap (多键映射表) 。这些容器的底层机制均以 RB-tree (红黑树) 完成
此外,SGI STL 还提供了一个不在标准规格之列的关联式容器:hash table (散列表),以及以此 hash table 为底层机制而完成的 hash_set (散列集合)、hash_map (散列映射表)、hash_multiset (散列多键集合)、hash_multimap (散列多键映射表)

set

map

multiset

multimap

hash table 散列表

二叉搜索树具有对数平均时间表现,但这样的表现构造在一个假设上:输入数据有足够的随机性。hashtable这种结构在插入、删除、查找具有“常数平均时间”,而且这种表现是以统计为基础,不需依赖元素的随机性。

hashtable底层数据结构为分离连接法的hash表,如下所示:

hashtable中的buckets使用的是vector数据结构,当插入一个元素时,找到该插入哪个buckets的插槽,然后遍历该插槽指向的链表,如果有相同的元素,就返回;否则的话就将该元素插入到该链表的头部。(当然,如果是multi版本的话,是可以插入重复元素的,此时插入过程为:当插入一个元素时,找到该插入哪个buckets的插槽,然后遍历该插槽指向的链表,如果有相同的元素,就将新节点插入到该相同元素的后面;如果没有相同的元素,产生新节点,插入到链表头部)

hash_set

hash_map

hash_multiset

hash_multimap

上一篇 下一篇

猜你喜欢

热点阅读