之前一直用STL也没有总结,总结《STL入门》一书概括:
c++ 版排序算法:
原始的C++写法,呵呵!其实我也蛮喜欢的,但是看着确实让人郁闷。。。。
当然这个例子有点一般,大部分人还是会考虑动态申请内存的,不过要用到new,delete操作符,或者古老的malloc(), realloc()和free()函数。
下面大家看STL版本:
STL版本一:
STL版本二之完美版:
STL大体上包括container(容器)、algorithm(算法)和iterator(迭代器),容器和算法通过迭代器可以进行无缝连接。
一、容器
作为STL的最主要组成部分--容器,分为向量(vector),双端队列(deque),表(list),队列(queue),堆栈(stack),集合(set),多重集合(multiset),映射(map),多重映射(multimap)。
容器 | 特性 | 所在头文件 |
向量vector | 可以用常数时间访问和修改任意元素,在序列尾部进行插入和删除时,具有常数时间复杂度,对任意项的插入和删除就有的时间复杂度与到末尾的距离成正比,尤其对向量头的添加和删除的代价是惊人的高的 | <vector> |
双端队列deque | 基本上与向量相同,唯一的不同是,其在序列头部插入和删除操作也具有常量时间复杂度 | <deque> |
表list | 对任意元素的访问与对两端的距离成正比,但对某个位置上插入和删除一个项的花费为常数时间。 | <list> |
队列queue | 插入只可以在尾部进行,删除、检索和修改只允许从头部进行。按照先进先出的原则。 | <queue> |
堆栈stack | 堆栈是项的有限序列,并满足序列中被删除、检索和修改的项只能是最近插入序列的项。即按照后进先出的原则 | <stack> |
集合set | 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序,具有快速查找的功能。但是它是以牺牲插入车删除操作的效率为代价的 | <set> |
多重集合multiset | 和集合基本相同,但可以支持重复元素具有快速查找能力 | <set> |
映射map | 由{键,值}对组成的集合,以某种作用于键对上的谓词排列。具有快速查找能力 | <map> |
多重集合multimap | 比起映射,一个键可以对应多了值。具有快速查找能力 | <map> |
考虑到不同的实际需要,更主要的是效率的需要,我们可以选择不同的容器来实现我们的程序,以此达到我们提高性能的目的。这也是用好STL的一个难点,但这也是关键。
二、算法
算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。<algorithm>是所有STL头文件中最大的一个,它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。<functional>中则定义了一些模板类,用以声明函数对象。
STL的算法也是非常优秀的,它们大部分都是类属的,基本上都用到了C++的模板来实现,这样,很多相似的函数就不用自己写了,只要用函数模板就OK了。
我们使用算法的时候,要针对不同的容器,比如:对集合的查找,最好不要用通用函数find(),它对集合使用的时候,性能非常的差,最好用集合自带的find()函数,它针对了集合进行了优化,性能非常的高。
三、迭代器
它的具体实现在<itertator> 中,我们完全可以不管迭代器类是怎么实现的,大多数的时候,把它理解为指针是没有问题的(指针是迭代器的一个特例,它也属于迭代器),但是,决不能完全这么做。
迭代器功能(Abilities Of Iterator Gategories) | ||
输入迭代器 Input iterator | 向前读 Reads forward | istream |
输出迭代器 Output iterator | 向前写 Writes forward | ostream,inserter |
前向迭代器 Forward iterator | 向前读写 Read and Writes forward | |
双向迭代器 Bidirectional iterator | 向前向后读写 Read and Writes forward and backward | list,set,multiset,map,mul timap |
随机迭代器 Random access iterator | 随机读写 Read and Write with random access | vector,deque,array,string |
--参考《STL入门教程》