
STL
Nestler
这个作者很懒,什么都没留下…
展开
-
【STL】算法 — sort
能使用STL的sort系列算法的前提是容器的迭代器必须为随机迭代器。所以,vector和deque天然适用。STL的sort算法采用了一些策略,在不同情况下采用不同的排序算法,以达到各种算法优势互补的效果。基本的原则是:数据量大时采用快速排序,数据量小时采用插入排序(这是对快排常用的一种优化策略),递归层次过深改用堆排序。首先是插入排序。它的平均和最坏时间复杂度都为O(N²),量级小于原创 2014-05-16 10:54:39 · 1379 阅读 · 0 评论 -
【STL】顺序容器 — queue
作为一种先进先出数据机构,同样不允许遍历行为,不存在迭代器。同stack一样,queue也是将deque作为底层容器。源码如下:template >class queue { ....protected: Sequence c; // 底层容器public: bool empty() const { return c.empty(); } size_type原创 2014-05-14 15:53:53 · 1062 阅读 · 0 评论 -
【STL】顺序容器 — slist
slist属于单链表,不在标准规格之内,是SGI STL特有的一种顺序容器。由于slist的迭代器属于前向迭代器,不能往前走,所以插入操作和list有所不同。根据STL的习惯,插入操作会将新元素插入于指定位置之前,但slist无法记录前驱节点(需要从头遍历找出前驱节点),所以插入操作提供了insert_after()和erase_after()版本。slist节点和迭代器的设计比lis原创 2014-05-14 15:56:04 · 1154 阅读 · 0 评论 -
【STL】仿函数
仿函数就是函数对象,只不过仿函数是老的叫法。仿函数和函数指针都可以作为参数传入函数,但仿函数的优势在于,它对类型抽象度高,并且能够和函数适配器进行匹配,但函数指针却不行。类似于迭代器需要包含五种相应类型,为了满足可配接能力,仿函数需要定义一些类型,这在分析适配器代码的时候会看到。这个任务交给了一个基类来完成,它的内部定义了这些类型,其它的仿函数只需要继承这些基类即可。基类定义如下:原创 2014-05-19 10:21:47 · 1051 阅读 · 0 评论 -
【STL】关联容器 — hashtable
C++ 11已将哈希表纳入了标准之列。hashtable是hash_set、hash_map、hash_multiset、hash_multimap的底层机制,即这四种容器中都包含一个hashtable。解决碰撞问题的办法有许多,线性探测、二次探测、开链等等。SGI STL的hashtable采用的开链方法,每个hash table中的元素用vector承载,每个元素称为桶(bucke原创 2014-05-11 09:37:52 · 1499 阅读 · 0 评论 -
【STL】关联容器 — hash_set
容器hash_set是以hash table为底层机制的,几乎所有的操作都是转调用hash table提供的接口。由于插入无法存储相同的键值,所以hash_set的插入操作全部都使用hash table的insert_unique接口,代码如下:pair insert(const value_type& obj){ pair p = rep.insert_unique(obj);原创 2014-05-12 09:25:17 · 1421 阅读 · 0 评论 -
【STL】算法 — copy
为了效率,copy算法可谓无所不用其极,通过分析copy算法能够体会STL的精妙。首先是三个对外接口:template // 泛化版本inline OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result){原创 2014-05-14 10:12:12 · 1861 阅读 · 0 评论 -
【STL】迭代器以及“特性萃取机”iterator_traits
迭代器是一种行为类似指针的对象,而指针的各种行为中最常见的便是解引用(*)和成员访问(->),此外还有operator++。因此,迭代器最重要的编程工作是对operator*和operator->进行重载工作。关于这部分的代码,可以参考class auto_ptr。迭代器一般会和某种容器相关联,指向某种类型的元素,这种元素的类型(value_type)叫做相应类型。常用的相应类型有五种原创 2014-05-14 16:02:36 · 1827 阅读 · 0 评论 -
C++模板Queue
《C++ primer》中的一个例子,ganjue原创 2014-09-05 21:55:15 · 1345 阅读 · 0 评论 -
C++简易list
list不同于vector,每个节点的结构需要自行定义,迭代器属于双向迭代器(不是随即迭代器),也需要自行定义。和通用迭代器一样,list的迭代器需要实现的操作有:++、--、*、->、==、!=。节点的数据结构命名为list_node,迭代器的数据结构命名为list_iterator。list中对迭代器的操作不应该使用算数运算,如+2、-3这样的操作,只应该使用++、--来移动迭代器。STI版本原创 2014-08-28 14:43:28 · 1478 阅读 · 0 评论 -
【STL】顺序容器 — stack
具有修改某物接口,形成另一种风貌之性质者,称为适配器。stack便是以deque为底层容器,适当封闭一些功能而形成一种具有“先进后出”特性,并不允许遍历行为的容器适配器。因为不能遍历容器,故stack没有迭代器。源码如下:template >class stack { ....protected: Sequence c; // 底层容器public: bool原创 2014-05-14 15:53:05 · 1075 阅读 · 1 评论 -
【STL】关联容器 — hash_map
hash_map和map的用法很相似,只是底层机制有所不同。hash_map容器采用的底层机制是hash table代码:template , class EqualKey = equal_to, class Alloc = alloc>class hash_map{private: typedef hashtable, Key原创 2014-05-12 10:25:25 · 1342 阅读 · 0 评论 -
【STL】关联容器 — set
set中的key就是value,value就是key,并且key是唯一的,利用红黑树有序地存储(红黑树在插入时自动调整)。正因为有序,所以无法通过迭代器随意修改key,否则顺序会打乱。set的底层容器就是rb_tree,有了tr_tree的基础,set的就很好理解了,很多的接口都只是转调用rb_tree的操作。整体代码如下:template class Key, class C原创 2014-05-09 13:56:25 · 914 阅读 · 0 评论 -
【STL】关联容器 — map
和set类似,也采用了rb_tree作为底层容器,但每个节点是一个pair对象,它关联了键值和实值。键值不允许修改,但实值是可以修改的,等下的代码也会有所说明。下面是map的代码框架:template class Key, class T, class Compare = less, class Alloc = alloc> // 默认采用递增顺序class原创 2014-05-09 13:56:56 · 986 阅读 · 0 评论 -
【STL】顺序容器 — priority_queue
拥有权值的queue,权值最高者永远排在最前面。priority_queue以vector为底层容器,配合heap的一套泛型算法,就能实现相应功能。代码如下:template , class Compare = less >class priority_queue { ....protected: Sequence c; // 底层容器 Co原创 2014-05-14 15:54:54 · 995 阅读 · 0 评论 -
【STL】适配器(adapters)
定义:将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作。适配器扮演者轴承、转换器的角色。分类:1、容器适配器:改变容器接口。STL提供两个容器迭代器:queue和stack。它们都是修饰deque后成为另一种风貌的容器。2、迭代器适配器:改变迭代器接口。Insert Iterator:将容器绑原创 2014-05-22 09:59:00 · 2815 阅读 · 0 评论 -
【STL】算法 — partial_sort
partial_sort接受一个middle迭代器,使序列中的middle-first个最小元素以递增顺序排序,置于[first, middle)内。下面是测试代码:#include #include #include using namespace std; int main(){ int a[] = {10,9,8,7,6,5,4,3,2,1,0}; vec原创 2014-05-15 12:05:01 · 8245 阅读 · 0 评论 -
【STL】空间配置器
STL定义了两种空间配置器:allocator:位于alloc:在包含以下头文件,将功能分离:全局函数construct()/destroy():位于,用于构造/析构对象。配置器alloc:位于,用于空间配置,分为一级配置器和二级配置器。uninitialized_copy/uninitialized_fill/uninitialized_fill_n:位于,用于填充或复制大块原创 2014-05-14 15:59:54 · 1159 阅读 · 0 评论 -
【STL】函数适配器
《C++ primer》中只说了适用于函数对象的适配器,其实还有针对函数和成员函数的适配器。这些适配器使我们能够将函数/成员函数当作仿函数使用,例如搭配各种泛型算法。从本质上说,是因为让这些函数变成为“可配接的”,即一元仿函数必须继承自unary_function,二元仿函数必须继承自binary_function。一般函数必须以ptr_fun处理:一般函数当作仿函数传给STL算法原创 2014-05-14 16:01:07 · 1547 阅读 · 0 评论 -
【STL】construct()和destroy()
STL定义了五个全局函数,作用于未初始化的空间上。其中两个全局函数construct()和destroy()负责对象的构造和析构,它们隶属于STL标准规范。构造对象直接使用定位new:template inline void construct(T1* p, const T2& value) { new (p) T1(value); // 定位new}原创 2014-05-14 15:58:18 · 2915 阅读 · 0 评论 -
【STL】顺序容器 — heap
heap不属于STL容器,它扮演者priority queue的助手。heap是一种完全二叉树,可由数组来实现,但heap需要动态改变大小,所以最终选择了vector作为底层容器。STL默认提供最大堆。题外话:分析heap的源码就能清楚的理解堆这种数据结构的例程,而STL库代码的质量又很高,所以看堆的代码,STL源码是一个很好的选择。为了满足完全二叉树的性质,新插入的元素一原创 2014-04-30 09:30:34 · 1233 阅读 · 0 评论 -
【STL】关联容器 — 红黑树
set、map、multiset、multimap四种关联式容器的内部都是由红黑树实现的。在STL中红黑树是一个不给外界使用的独立容器。既然是容器,那么就会分配内存空间(节点),内部也会存在迭代器。关于红黑树的一些性质,可以参考“数据结构”中的笔记,这里只记录STL中的红黑树是如何实现的。和slist一样,红黑树的节点和迭代器均采用了双层结构:节点:__rb_tree_no原创 2014-05-07 11:17:15 · 2066 阅读 · 0 评论 -
STL算法实现
写了一点STL算法,模板biancheng原创 2014-09-03 16:26:26 · 1079 阅读 · 0 评论