STL源码分析
文章平均质量分 87
Sunshine_top
安安静静、认认真真完成自己的事情
展开
-
STL源码:内存基本处理工具
STL定义了五个全局函数,作用于没有初始化空间上。前两个函数时用于构造的constr() 和用于析构的destroy()。另外三个是uninitialized_copy(),uninitialized_fill(),uninitialized_fill_n(),分别对应于高层次函数copy()、fill()、fill_n()——这些都是STL算法,要使用这三个底层次函数,应该包含,不过SGI将其实原创 2015-03-19 17:08:57 · 1466 阅读 · 0 评论 -
STL源码:map、set与其他顺序容器的一些比较
map map的特性:所有元素会按照元素的键值自动排序。map所有元素都是pair,第一个元素视为键值,第二个元素视为实值;map不允许两个元素拥有相同的键值。 可以修改元素的实值,但是不能修改元素的键值(键值是const类型的),因此map的迭代器既不是constant Iterators,也不是mutale Iterators。set s原创 2015-03-31 08:54:17 · 1535 阅读 · 0 评论 -
STL源码:空间配置器(二)构造和析构construct()/destroy()
#ifndef __SGI_STL_INTERNAL_CONSTRUCT_H #define __SGI_STL_INTERNAL_CONSTRUCT_H // 欲使用 placement new,需先包含此文件 #include __STL_BEGIN_NAMESPACE // 以下是 des原创 2015-03-23 10:22:20 · 1579 阅读 · 0 评论 -
STL源码:priority_queue
优先队列完全以底部容器为依据,加上heap处理规则,实现很简单。缺省下以vector为底部容器,利用大根堆。它是一个有权值概念的queue(头出尾进,无其他存取元素的途径)。 和queue、stack一样,是容器适配器,详见queue#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate ,class Compare =原创 2015-03-25 19:45:29 · 1396 阅读 · 0 评论 -
STL源码:空间配置器(三)内存的配置和释放、SGI的两级适配器
空间的配置与释放std::alloc 之前了解了内存配置后的对象构造和内存释放前的对象析构行为,现在分析内存配置和释放。对象构造前的空间配置和对象析构后的空间释放,由负责,SGI对此的设计哲学如下: 1. 向 system heap 要求空间。 2. 考虑多线程(multi-threads)状态。 3. 考虑内存不足时原创 2015-03-23 10:41:13 · 2130 阅读 · 0 评论 -
STL源码:红黑树
红黑树的性质和插入操作这部分参考文章 《红黑树操作及实现》红黑树节点结构typedef bool __rb_tree_color_type;const __rb_tree_color_type __rb_tree_red = false; // 红色为0const __rb_tree_color_type __rb_tree_black = true; // 黑色为1s原创 2015-03-30 15:42:07 · 2840 阅读 · 0 评论 -
STL源码:list
相较于vector的连续线性空间,list就显得复杂许多,它的好处是每次插入或删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素移除,list永远是常数时间。 list不仅是一个双向链表,而且还是一个环状双向链表,因此迭代器必须具备前移和后移能力,所以list使用Bidirectional Iterato原创 2015-03-24 14:42:37 · 2098 阅读 · 0 评论 -
STL源码:空间配置器(一)SGI的空间配置器
SGI标准的空间配置器,std::allocator 虽然 SGI 也定义有一个符合部分标准、名为 allocator 的配置器,但 SGI 从未用过它,也不建议我们使用。主要原因是效率不佳,只把 C++ 的 ::operator new 和 ::operator delete 做一层薄薄的包装而已,根本没有考虑任何效率的强化。// 我们不赞成包含此文件,这是原始的 HP原创 2015-03-23 10:14:49 · 1322 阅读 · 0 评论 -
STL源码:queue
queue是先进先出(FIFO)的数据结构,有两个口:允许从尾部加入元素、取得头部的元素。没有其他任何方法可以存取queue的其它元素,即queue不允许遍历行为。 SGI STL以deque作为缺省情况下的queue底部结构,queue的实现很简单,代码十分简短。 queue没有迭代器。为什么STL queue称为容器适配器而不是容器?原创 2015-03-25 16:15:17 · 2655 阅读 · 0 评论 -
STL源码:deque
deque概述 vector是单向开口的连续线性空间,deque是双向开口(在头尾分别做元素删除和插入操作)的连续线性空间。从技术上说,vector也可以在头尾两端操作元素,但是在头部操作的效率很差。 deque和vector的最大差异:(1)deque允许在头部快速进行元素插入或删除操作;(2)deque没有容量(capacity)的概念,因为它是动态地以原创 2015-03-25 09:49:50 · 2238 阅读 · 0 评论 -
STL源码:stack
stack是先进后出的。和queue一样:(1)默认使用deque作为其底层元素; (2)它也是容器适配器(详见queue); (3)没有迭代器; (4)可以使用list作为底层容器。STL queue源码#原创 2015-03-25 16:54:39 · 1354 阅读 · 0 评论 -
STL源码:multimap、multiset
multiset和multimap与set、map的特性以及用法完全相同,差别之一是它允许一个键对应多个实例,因为它们的插入操作使用的是底层RB-tree的insert_equal() 而不是insert_unique()函数。第二个差别multimap不支持下标运算,而map支持。 在电话薄中,每个人可能对应多个电话号码;作家会有多本对应的著作;这都需要用multimap来表原创 2015-03-31 15:55:23 · 1297 阅读 · 0 评论 -
STL源码:slist
STL list是双向链表。SGI STL还提供了单向链表slist(single linked list)。这个容器不再标准范围内。 slist和list 的主要差别在于,前者迭代器是单向的Forward Iterator,后者迭代器是双向的Bidirectional Iterator,因此,slist功能会有很多限制;不过slis所耗空间小,某些操作快。 s原创 2015-03-27 09:32:27 · 1591 阅读 · 0 评论 -
STL源码:vector
vector与array的相同与不同:相同: vector的数据安排以及操作方式与array很相似。不同: 两者的差别主要是在空间运用的灵活上。 array是静态空间,一旦配置了就不能改变;如果要换个大的空间,就要由客户自己来完成:重新申请新空间,然后将元素都从旧地址搬移到新地址,再将原空间释放。 vec原创 2015-03-19 15:22:21 · 2309 阅读 · 0 评论 -
STL源码:算法sort
sort算法适用范围 sort算法接受两个RandomAccessIterators(随机存取迭代器),然后对区间内元素以渐增方式由小到大排序;另一个版本允许用户指定排序方式。 STL的所有关联容器都拥有自动排序功能(以为底层的RB-tree是自动排序的)因此,不需要使用sort算法。顺序容器中stack、queue、priority-queue都有特定的入口和原创 2015-04-03 09:57:20 · 1405 阅读 · 0 评论 -
STL源码:hashtable
前面介绍的RB-tree红黑树中,可以看出红黑树的插入、查找、删除的平均时间复杂度为O(nlogn)。但这是基于一个假设:输入数据具有随机性。而哈希表/散列表hash table在插入、删除、查找上具有“平均常数时间复杂度”O(1);且不依赖输入数据的随机性。 hash函数会带来一个问题:可能有不同的元素被映射到相同位置,这就是碰撞问题。解决碰撞的方法很多,hash table原创 2015-03-31 16:52:00 · 1648 阅读 · 0 评论 -
STL源码:hash_set、hash_map、hash_multiset、hash_multimap
hash_set 虽然STL只规范复杂度和接口,并不规范实现方法,但STL set多半以RB-tree为底层机制。 SGI在标准之外提供了hash_set,以hashtable作为底层机制。用set为的是能快速搜寻元素。这一点无论底层是RB-tree还是hashtable都能实现。但RB-tree有自动排序能力而hashtable没有,其结果就是set元素会自动排原创 2015-03-31 18:23:00 · 1578 阅读 · 0 评论 -
STL源码:heap
heap不归属STL容器组件,它是priority queue的幕后英雄。为什么用二叉大根堆作为优先队列的底层机制? 答:优先队列允许用户以任何次序将任何元素插入容器,但取出时要从优先权最大的元素开始取。二叉大根堆具有这样的特性,因此作为优先队列的底层机制。 关于二叉堆实现优先队列的可行性见《二叉堆的插入删除等操作C++实现》能不能用li原创 2015-03-25 17:05:58 · 1314 阅读 · 0 评论