STL进修系列之四:STL进修小结
当前位置:以往代写 > C/C++ 教程 >STL进修系列之四:STL进修小结
2019-06-13

STL进修系列之四:STL进修小结

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];
    }
  /

    关键字:

在线提交作业