STL学习系列之四:STL学习小结

提供了类型安全、高效而易用特性的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>中则定义了一些模板类,用以声明函数对象。

STL的算法也是非常优秀的,它们大部分都是类属的,基本上都用到了C++的模板来实现,这样,很多相似的函数就不用自己写了,只要用函数模板就OK了。

我们使用算法的时候,要针对不同的容器,比如:对集合的查找,最好不要用通用函数find(),它对集合使用的时候,性能非常的差,最好用集合自带的find()函数,它针对了集合进行了优化,性能非常的高。

时间: 2024-10-01 02:27:23

STL学习系列之四:STL学习小结的相关文章

LINQ To SQL深入学习系列之四 LINQ查询基础

本文部分内容整理自msdn 一.LINQ的概念: LINQ是Language Integrated Query(语言集成查询)的简称,它是集成在.NET编程语言中的一种特性 ,这使得查询表达式可以得到很好的编译时语法检查,丰富的元数据,智能感知等强类型语言的好处LINQ 是 Visual Studio 2008 和 .NET Framework 3.5 版中一项突破性的创新,它在对象领域和数据领域之间 架起了一座桥梁. 二.LINQ出现的背景: 传统上,针对数据的查询都是以简单的字符串表示,而没

JBossSeam学习系列之四:第二个例子

上次使用Seam自动生成了一个CRUD的例子,后来想还是自己白手起家做一个例子看看,于是开始动手. 首先使用JBossTools工具生成项目,在生成项目的向导中,如果项目类型选择ear,则会生成四个项目,分别对应war.ear.ejb.test,觉得这样太过繁琐,还是选择war类型,又想要不使用tomcat作为运行服务器吧,因为JBoss也不太熟悉.没想到这一试倒试出问题来了,如果完全使用向导生成项目,选择tomcat作为运行服务器,则项目根本无法运行起来,总是提示缺少这个jar,那个jar.好

JAVA/JSP学习系列之四_php基础

一.前言 Orion这个东西,小巧,但是功能却非常多,废话不讲,看它目前的支持就知道了: (1)Servlets/JSP (2)EJB (3)HTTP (注:说明不再需要Apache或者IIS等Web Server) 二.下载,安装 下载地址为Orion Application Server官方站点:http://www.orionserver.com/,我下载的是Orion1.4版本. 下载完,解压到一个目录,我这里用E:Orion作为例子. 三.配置 (1)根据Orion官方站点的安装说明,

JAVA/JSP学习系列之四(Orion App Server的安装)_JSP编程

一.前言 Orion这个东西,小巧,但是功能却非常多,废话不讲,看它目前的支持就知道了:       (1)Servlets/JSP       (2)EJB       (3)HTTP (注:说明不再需要Apache或者IIS等Web Server) 二.下载,安装 下载地址为Orion Application Server官方站点:http://www.orionserver.com/,我下载的是Orion1.4版本. 下载完,解压到一个目录,我这里用E:\Orion作为例子.    三.配

JAVA/JSP学习系列之四(Orion App Server的安装)

一.前言 Orion这个东西,小巧,但是功能却非常多,废话不讲,看它目前的支持就知道了:       (1)Servlets/JSP (2)EJB (3)HTTP (注:说明不再需要Apache或者IIS等Web Server) 二.下载,安装 下载地址为Orion Application Server官方站点:http://www.orionserver.com/,我下载的是Orion1.4版本. 下载完,解压到一个目录,我这里用E:\Orion作为例子. 三.配置 (1)根据Orion官方站

STL学习系列之一——标准模板库STL介绍

库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的分离,非面向对象本质.访问对象是通过象指针一样的迭代器实现的: 容器是象链表,矢量之类的数据结构,并按模板方式提供: 算法是函数模板,用于操作

“机器学习”三重门,“中庸之道”趋若人(深度学习入门系列之四)

更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud 系列文章: 一入侯门"深"似海,深度学习深几许(深度学习入门系列之一) 人工"碳"索意犹尽,智能"硅"来未可知(深度学习入门系列之二) 神经网络不胜语,M-P模型似可寻(深度学习入门系列之三) -------------------------------- 在前一个小节中,我们简单地谈了谈什么是"M-P神经元模型",顺便用生活中生动的小案

详细解说STL hash_map系列 〔转载〕

详细解说STL hash_map系列 0 为什么需要hash_map 1 数据结构:hash_map原理 2 hash_map 使用 2.1 一个简单实例 2.2 hash_map 的hash函数 2.3 hash_map 的比较函数 2.4 hash_map 函数 3 相关hash容器 4 其他 4.1 hash_map和map的区别在哪里? 4.2 什么时候需要用hash_map,什么时候需要用map? 4.3 如何在hash_map中加入自己定义的类型? 4.4如何用hash_map替换程

ExtJs2.0学习系列(2)--Ext.Panel

上一篇文章ExtJs2.0学习系列(1)--Ext.MessageBox ,受到了大家的褒贬不一,还是有的朋友提出好的建议,在此表示感谢! 今天介绍extjs中的Panel组件. //html代码 <div id="container"> </div> //js代码 var p = new Ext.Panel({ title: 'My Panel',//标题 collapsible:true,//右上角上的那个收缩按钮,设为false则不显示 renderTo: