空间配置器:
隐藏在容器的背后,负责空间的配置与管理
一级空间配置器(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>常量设定,让编译器根据不同的版本取舍变量
《完》