STL进修系列之四:STL进修小结
副标题#e#
提供了范例安详、高效而易用特性的STL无疑是最值得C++措施员自满的部门。每一个C++措施员都应该好勤进修STL:).
STL(Standard Template Library 尺度模板库)是C++尺度库的一个重要构成部门,它由Stepanov and Lee等人最先开拓,它是与C++险些同时开始开拓的;一开始STL选择了Ada作为实现语言,但Ada有点不争气,最后他们选择了C++,一个原因了,C++中已经有了模板。在厥后,STL又被添加进了C++库。1996年,惠普公司又免费果真了STL,为STL的推广做了很大的孝敬。
STL概略上包罗container(容器)、algorithm(算法)和iterator(迭代器),容器和算法通过迭代器可以举办无缝毗连。
STL浮现了范型编程的思想,它具有高度的可重用性,高机能,高移植性。措施员不消思考详细实现进程,只要可以或许纯熟的应用就OK了。(有乐趣研究详细实现的,可以看侯捷老师编著的《STL源码分解》)这样他们就可以把精神放在措施开拓的此外方面。
我很是服气缔造STL的那些计较机和数学精英。因为他们做了一件很是辛苦的工作―――抽象观念。而STL就是通过把容器抽象为统一的接口,算法操作这个接口,通过迭代器来哄骗容器。因为接口稳定,实现的容器可以随意变动。这样,就为编程、调试和扩展提供了便利。也许有一天,我们出产软件的时候也可以想DIY一台PC一样简朴,只要拿来相应的实现模块,通过简朴的拼装和调试就可以缔造一个软件。这是何等令人欢快的一件事^_^.不外,到时候,大概会有许多措施员赋闲了。呵呵,究竟编写类库不需要许多的人员。
固然STL不是面向工具的,但,我想,每小我私家城市为它的缔造力和高机能而感想欢快和折服。
一、容器
作为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>中则界说了一些模板类,用以声明函数工具。
#p#分页标题#e#
STL的算法也长短常优秀的,它们大部门都是类属的,根基上都用到了C++的模板来实现,这样,许多相似的函数就不消本身写了,只要用函数模板就OK了。
我们利用算法的时候,要针对差异的容器,好比:对荟萃的查找,最好不要用通用函数find(),它对荟萃利用的时候,机能很是的差,最好用荟萃自带的find()函数,它针对了荟萃举办了优化,机能很是的高。
#p#副标题#e#
三、迭代器
它的详细实此刻<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 |
由此可见,指针和迭代器照旧有很大不同的。和指针最靠近的就是随时机见迭代器。下面是一个我编写的小例子:成果是别离对数组,向量,表,多重荟萃举办插入操纵,对每个容器插入100万个随机整数;
#include<iostream>
#include<iterator>
#include<vector>
#include<list>
#include<set>
#include<time.h>
#include<conio.h>
#include<algorithm>
using namespace std;
template<typename T>
void arrayInsert(T*a,T*s,long size) //向数组插入数据
{
//for(long i=0;i<10;i++) // //仿佛数组支持不到100万,我们就算10万的
//最后在把把功效乘以10吧,
//{
for(long k=0;k<size;k++)
{
a[k]=s[k];
}
/