空间配置器:

隐藏在容器的背后,负责空间的配置与管理

一级空间配置器(malloc_alloc)和二级空间配置器(default_alloc)

SGI标准空间配置器std::allocator    ||未考虑效率

SGI特殊空间配置器std::alloc       ||allocate()  construct()  destroy()  deallocate()

二级空间配置器free lists、memory pool

内存处理工具 construct()  destroy()  uninitialized_copy()

          uninitialized_fill()  uninitialized_fill_n()

 

迭代器:

迭代器设计思维——STL的关键所在

迭代器是一种smart point  泛型指针

迭代器相应型别

Traits编程技巧

前闭后开

所有的容器都带有自己专属的迭代器,只有容器自己才知道如何遍历自己的元素

operator*  ->   ++   --

原生指针也是一种迭代器



容器:

序列式容器:

vector:vector采用的数据结构就是线性连续空间

    vector是动态空间,随着元素的加入,会自动扩充空间,array静态空间

    “配置空间/数据移动/释还旧空间”

    对vector的操作,一旦引起空间重配置(push_back和insert的时候),会引起迭代器失效

list: 相比vector来说,对空间利用一点不浪费,插入删除永远是时间常数

    双向链表,不保证存储空间连续,迭代器为Bidirectional Iterator

    插入和删除操作都不会造成迭代器失效

    list是一个双向环装链表

deque:vector是单向开口的连续线性空间

     deque是双向开口的连续线性空间

关联式容器:

容器内部可能是RBTree 或hashTable ,所以依照其键值大小,以某种特定规则将元素插入,所以关联式容器没有所谓的头尾,只有最大元素和最小元素,所以也不会有push_back() begin()等类似操作


一般而言,关联式容器内部是一个平衡二叉树(BSTree、AVLTree、RBTree),但运用最广的是RBTree


set:(集合)

    所有元素都会根据键值进行排序,set不允许有两个相同的键值

    不能通过迭代器对set的元素进行修改,set的键值即实值,实值即键值,底层为const

    set使用红黑树的insert_unique(),mutilset才能使用insert_equal()

    关联式容器进行查找时最好使用其自己提供的find,而不是STL算法find

map:(映射表)

    map的所有元素都是pair,pair的第一元素称为键值,第二元素称为实值

    map会根据其键值进行排序,不允许两个相同的键值

    map不可以通过迭代器修改其键值,但可以修改其实值

mutilset:(多键集合)

mutilmap:(多键映射表)

RB-Tree:也是一个独立容器,但并不对外开放,它用作set、map的底层结构

     RB-Tree的迭代器是双向迭代器,重载++   --  increment()   decrement()

        ++ 四种情况:1、节点有右孩子节点,返回这个右孩子的最左结点

               2、节点无右孩子,parent=cur->parent;

                     while(cur==parent->right)

                    {cur=parent;parent=parent->parent;}

                      if(cur->right!=parent)

                        return cur;

        -- 四种情况:1、节点为header,返回该节点的右孩子节点

               2、节点有左孩子节点,返回这个左孩子的最右节点

               3、节点无左孩子,parent=cur->parent;

                     while(cur==parent>left)                                {cur=parent;parent=parent->parent;}

                        return parent;

     SGI特别为根结点再设计一个header节点,这个节点的父节点是根节点,左孩子节点是这颗

        树中最小节点,右孩子节点是这颗树中最大节点,根节点的父节点是这个节点

以下四种为SGI标准

hash_set:(散列集合)

hash_map:(散列映射表)

hash_multiset:(散列多键集合)

hash_multimap:(散列多键映射表)


算法:

各种常用算法,如sort  search  copy...


仿函数:

函数对象

行为类似函数,重载了operator()的类

可作为算法的某种策略


配接器:

以某种已有容器作为其底部结构

由于他们是以底部容器完成所有工作,具有这种“修改某物接口,形成另一种风貌”的性质,称为配接器

stack:      SGI版本默认以deque作为其底层结构,也可以list作为底层容器  封闭一端

        没有迭代器,“先进后出”

queue:    和stack底层基本一样,“先进后出”

priority_queue:priority_queue是一个拥有权值观念的queue

        权值高的在最前面,大堆保证

         缺省情况用max-heap完成,max-heap以vector 表示的完全二叉树实现

        



<stl_config.h>常量设定,让编译器根据不同的版本取舍变量


《完》