关于stl的浅显见识

来源:互联网 发布:程序员个人简历模板 编辑:程序博客网 时间:2024/04/30 20:52

在用了STL做了几个编程题之后,决定就stl抒发一下自己的见解。 


一 STL简介(来源与百度)


STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。


二 STL代码分类


 STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。


STL提供了很多的函数,这样一来,只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。


三、容器


在实际的开发过程中,经典的数据结构数量有限,但是我们常常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在细节上有所出入。STL容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模版类,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。


容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>组成。对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下表总结一下它们和相应头文件的对应关系。


向量(vector) 连续存储的元素<vector>


列表(list)       由节点组成的双向链表,每个结点包含着一个元素<list>


双队列(deque) 连续存储的指向不同元素的指针所组成的数组<deque>


集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序 <set>


多重集合(multiset) 允许存在两个次序相等的元素的集合 <set>


栈(stack) 后进先出的值的排列 <stack>


队列(queue) 先进先出的执的排列 <queue>


优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列 <queue>


映射(map) 由{键,值}对组成的集合,以某种作用于键对上的谓词排列 <map>


多重映射(multimap) 允许键对有相等的次序的映射 <map>


 


四、迭代器


老实讲这个迭代器这个东西我现在还用不熟练。


概括来说,迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。










讲真,这个专题是STL的简单应用,主要介绍了几种函数的简单应用,就是上面摞列的几种函数。


其中,常用的就是sort,vector,map,set;感觉queue,stack之类的着实用不太上,这也可能与我做题比较少有很大的关系


关于sort函数,相当好用,尤其是我们做acm的题的时候,很多情况都是需要我们排序的,但是如果我们用冒泡排序之类的,不但字符冗长而且容易超时,而一个sort就可以解决问题,而且因为sort是默认从小到大排,你也完全可以先写一个比较函数重载小于号然后sort排序,非常的简单方便。


关于vector
我们不仅可以使用迭代器访问元素,还可以使用指针的偏移方式访问,和常规数组比vector能够自动存储元素,可以自动增长或缩小存储空间,
vector的优点:
1.       可以使用下标访问个别的元素
2.       迭代器可以按照不同的方式遍历容器
3.       可以在容器的末尾增加或删除元素
关于set和multiset


set和multiset会根据特定的排序准则,自动将元素排序,两者的不同之处在于multiset可以允许元素重复而set不允许元素重复。
而且默认是从小到大排,同样可以通过重载小于号改变排序。
关于map和multimap
关于map的用处
当你需要快速的获取对应key的value的时候,就可以使用map了。例如一个人是有名字,但是这个人还有其他的属性,例如年龄,性别等等。这个人就会被封装为一个对象。如果有很多个人,我们需要快速的根据一个人的名字获取对应名字的对象,这个时候map就有用了。如果采用数组,我们需要遍历整个数组,才可以根据名字找到这个人。如果是map(以名字为key,以人的对象为value),就可以直接根据名字得到这个对象,就不需要遍历操作了。这样会大大的节省你程序代码运行的时间。

在这篇博客里,我并没有写关于种种函数的操作,如果大家想更详细的了解函数的用法,可以百度TAT

以上就是我对stl的见解,如有不对,欢迎大家指正。




0 0
原创粉丝点击