c++中STL库 简介 及 使用说明_c++ stl标准库应用到ubuntu-程序员宅基地

技术标签: C++ programing language  算法  c++  语言  library  microsoft  数据结构  

 

 

作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的。STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现。本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情。   

初识STL:解答一些疑问   

1.1 一个最关心的问题:什么是STL   

"什么是STL?",假如你对STL还知之甚少,那么我想,你一定很想知道这个问题的答案,坦率地讲,要指望用短短数言将这个问题阐述清楚,也决非易事。因此,如果你在看完本节之后还是觉得似懂非懂,大可不必着急,在阅读了后续内容之后,相信你对STL的认识,将会愈加清晰、准确和完整。不过,上述这番话听起来是否有点像是在为自己糟糕的表达能力开脱罪责呢?:)   

不知道你是否有过这样的经历。在你准备着手完成数据结构老师所布置的家庭作业时,或者在你为你所负责的某个软件项目中添加一项新功能时,你发现需要用到一个链表(List)或者是映射表(Map)之类的东西,但是手头并没有现成的代码。于是在你开始正式考虑程序功能之前,手工实现List或者Map是不可避免的。于是……,最终你顺利完成了任务。或许此时,作为一个具有较高素养的程序员的你还不肯罢休(或者是一个喜欢偷懒的优等生:),因为你会想到,如果以后还遇到这样的情况怎么办?没有必要再做一遍同样的事情吧!   

如果说上述这种情形每天都在发生,或许有点夸张。但是,如果说整个软件领域里,数十年来确实都在为了一个目标而奋斗--可复用性(reusability),这看起来似乎并不夸张。从最早的面向过程的函数库,到面向对象的程序设计思想,到各种组件技术(如:COM、EJB),到设计模式(design pattern)等等。而STL也在做着类似的事情,同时在它背后蕴涵着一种新的程序设计思想--泛型化设计(generic programming)。   

继续上面提到的那个例子,假如你把List或者map完好的保留了下来,正在暗自得意。且慢,如果下一回的List里放的不是浮点数而是整数呢?如果你所实现的Map在效率上总是令你不太满意并且有时还会出些bug呢?你该如何面对这些问题?使用STL是一个不错的选择,确实如此,STL可以漂亮地解决上面提到的这些问题,尽管你还可以寻求其他方法。   

说了半天,到底STL是什么东西呢?   

STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。这种现象有些类似于Microsoft Visual C++中的MFC(Microsoft Foundation Class Library),或者是Borland C++ Builder中的VCL(Visual Component Library),对于此二者,大家一定不会陌生吧。   

从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming),引入了诸多新的名词,比如像需求(requirements),概念(concept),模型(model),容器(container),算法(algorithmn),迭代子(iterator)等。与OOP(object-oriented programming)中的多态(polymorphism)一样,泛型也是一种软件的复用技术。   

从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的,这种方式基于一个在早先C++标准中没有出现的语言特性--模板(template)。如果查阅任何一个版本的STL源代码,你就会发现,模板作为构成整个STL的基石是一件千真万确的事情。除此之外,还有许多C++的新特性为STL的实现提供了方便。   

不知你对这里一下子冒出这么多术语做何感想,希望不会另你不愉快。假如你对它们之中的大多数不甚了解,敬请放心,在后续内容中将会对这些名词逐一论述。正如开头所提到的。   

有趣的是,对于STL还有另外一种解释--STepanov %26amp; Lee,前者是指Alexander Stepanov,STL的创始人;而后者是Meng Lee,她也是使STL得以推行的功臣,第一个STL成品就是他们合作完成的。这一提法源自1995年3月,Dr.Dobb’s Journal特约记者, 著名技术书籍作家Al Stevens对Alexander Stepanov的一篇专访。   






1.2 追根溯源:STL的历史   


在结识新朋友的时候,大多数人总是忍不住想了解对方的过去。本节将带您简单回顾一下STL的过去。   

被誉为STL之父的Alexander Stepanov,出生于苏联莫斯科,早在20世纪70年代后半期,他便已经开始考虑,在保证效率的前提下,将算法从诸多具体应用之中抽象出来的可能性,这便是后来泛型化思想的雏形。为了验证自己的思想,他和纽约州立大学教授Deepak Kapur,伦塞里尔技术学院教授David Musser共同开发了一种叫做Tecton的语言。尽管这次尝试最终没有取得实用性的成果,但却给了Stepanov很大的启示。   

在随后的几年中,他又和David Musser等人先后用Schema语言(一种Lisp语言的变种)和Ada语言建立了一些大型程序库。这其间,Alexander Stepanov开始意识到,在当时的面向对象程序设计思想中所存在的一些问题,比如抽象数据类型概念所存在的缺陷。Stepanov希望通过对软件领域中各组成部分的分类,逐渐形成一种软件设计的概念性框架。   

1987年左右,在贝尔实验室工作的Alexander Stepanov开始首次采用C++语言进行泛型软件库的研究。但遗憾的是,当时的C++语言还没有引入模板(template)的语法,现在我们可以清楚的看到,模板概念之于STL实现,是何等重要。是时使然,采用继承机制是别无选择的。尽管如此,Stepanov还是开发出了一个庞大的算法库。与此同时,在与Andrew Koenig(前ISO C++标准化委员会主席)和Bjarne Stroustrup(C++语言的创始人)等顶级大师们的共事过程中,Stepanov开始注意到C/C++语言在实现其泛型思想方面所具有的潜在优势。就拿C/C++中的指针而言,它的灵活与高效运用,使后来的STL在实现泛型化的同时更是保持了高效率。另外,在STL中占据极其重要地位的迭代子概念便是源自于C/C++中原生指针( native pointer)的抽象。   

1988年,Alexander Stepanov开始进入惠普的Palo Alto实验室工作,在随后的4年中,他从事的是有关磁盘驱动器方面的工作。直到1992年,由于参加并主持了实验室主任Bill Worley所建立的一个有关算法的研究项目,才使他重新回到了泛型化算法的研究工作上来。项目自建立之后,参与者从最初的8人逐渐减少,最后只剩下两个人--Stepanove本人和Meng Lee。经过长时间的努力,最终,信念与汗水所换来的是一个包含有大量数据结构和算法部件的庞大运行库。这便是现在的STL的雏形(同时也是STL的一个实现版本--HP STL)。   

1993年,当时在贝尔实验室的Andrew Koenig看到了Stepanove的研究成果,很是兴奋。在他的鼓励与帮助下,Stepanove于是年9月的圣何塞为ANSI/ISO C++标准委员会做了一个相关演讲(题为"The Science of C++ Programming"),向委员们讲述了其观念。然后又于次年3月,在圣迭戈会议上,向委员会提交了一份建议书,以期使STL成为C++标准库的一部分。尽管这一建议十分庞大,以至于降低了被通过的可能性,但由于其所包含的新思想,投票结果以压倒多数的意见认为推迟对该建议的决定。   

随后,在众人的帮助之下,包括Bjarne Stroustrup在内,Stepanove又对STL进行了改进。同时加入了一个封装内存模式信息的抽象模块,也就是现在STL中的allocator,它使STL的大部分实现都可以独立于具体的内存模式,从而独立于具体平台。在同年夏季的滑铁卢会议上,委员们以80%赞成,20%反对,最终通过了提案,决定将STL正式纳入C++标准化进程之中,随后STL便被放进了会议的工作文件中。自此,STL终于成为了C++家族中的重要一员。   

此后,随着C++标准的不断改进,STL也在不断地作着相应的演化。直至1998年,ANSI/ISO C++标准正式定案,STL始终是C++标准中不可或缺的一大部件。









一.什么时候用STL

    如果,有的时候,你要在程序中用到堆、栈、队列、链表等一些基本的算法,而你又实在不想自己去实现数据结构教科书中那些繁琐的算法,那么你就可以考虑使用STL。

    另外,STL作为一种标准,便于交流,掌握它,一方面可以让你写的程序,易于让别人理解,另一方面你也能够比较容易地理解别人写的程序。

二.什么是STL

    全称为  Standard Template Library  ,即标准模板库

    要使用STL,要了解以下几个基本概念:

        容器:可以把它理解为存放数据的地方,常用的一些容器有 链表(list) 栈(stack) 动态数组 (vector) 双端队列(deque) 队列(queue) 映射(map)

        游标(iterator):可以把它理解为指针类型,STL中的许多函数需要用到它们作为参数

        算法:它们通常需要与容器和游标配合使用,使用它们,你可以方便地对容器中的数据进行各种常见的操作,如排序操作,寻找最大元素的操作等

STL(2)--使用

一、容器模板的使用

    大致有下面6个步骤:

        1.添加相应的头文件(如 #include <list> )( 注意,没有 .h )

        2.添加std命名空间(用 using namespace std; )

        3.赋予模板具体的使用类型(如 typedef list<string> LISTSTR; )

        4.实例化模板(如 LISTSTR test; )

        5.实例化游标(如 LISTSTR::iterator i; )

        6.通过迭代器对象访问模板对象,例如

            // 逐个输出链表test中的元素
            for ( i =  test.begin(); i != test.end(); ++i )
                cout << *i << " ";

二、容器模板中的常用函数

   assign()           赋值

   empty()            容器为空则返回非0值

   erase()            删除指定位置或指定范围内的元素

   push_front()   从容器头部插入元素  

   push_back()   从容器尾部插入元素

   pop_front()     删除第一个元素

   pop_back()     删除最后一个元素

   back()              返回最后一个元素的引用

   front()              返回第一个元素的引用

   begin()             返回指向第一个元素的游标 (与迭代器配合使用)

   end()                返回指向最后一个元素的后一个位置的游标 (最后1个元素再加1) (与迭代器配合使用)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tanqiuwei/article/details/7323374

智能推荐

BAT批处理文件 拷贝与删除命令(copy,xcopy,del,rd)_bat copy-程序员宅基地

文章浏览阅读3.6w次,点赞12次,收藏41次。copy命令将一份或多份文件复制到另一个位置。COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/L] [/A | /B ] source [/A | /B][+ source [/A | /B] [+ …]] [destination [/A | /B]]source指定要复制的文件。/A表示一个 ASCII 文本文件。/B表示一个二..._bat copy

iOS UIWebView URL拦截_ios webview 拦截请求使用本地资源-程序员宅基地

文章浏览阅读845次。本文译者:candeladiao,原文:URL filtering for UIWebView on the iPhone说明:译者在做app开发时,因为页面的javascript文件比较大导致加载速度很慢,所以想把javascript文件打包在app里,当UIWebView需要加载该脚本时就从app本地读取,但UIWebView并不支持加载本地资源。最后从下文中找到了解决方法,第一次翻译,难免有_ios webview 拦截请求使用本地资源

jsp中basepath的作用的思考_jsp文件中的basepath为啥-程序员宅基地

文章浏览阅读1.8k次。JSP里的basePath(本文为转载文章,文章转载自http://blog.csdn.net/lutinghuan/article/details/6450174)Eclipse 新建 jsp页面里自动生成以下代码:String path = request.getContextPath();String basePath = request.getScheme()+_jsp文件中的basepath为啥

httpclient常用基本抓取类_httpclient获得类标签-程序员宅基地

文章浏览阅读4.2k次。package com.reallyinfo.athena.crawlMethodManager;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Reader;import java.io.UnsupportedEn_httpclient获得类标签

单片机的ADC注意事项_dsp28034 adc运行卡死-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏6次。大部分ADC转换的第一次是不准的,所以第一次先转换一下,丢弃,后面再转换,保存ADC 滤波方法建议采用中值平均滤波法,有两种,第一种占用内存烧,第二种滤波更好,占内存大,和时间慢 /*********************************************************函数名: unsigned int ADCRead()描 述: ADC转换程序,转换18次,..._dsp28034 adc运行卡死

cyj sql 收藏_sql语句中的ü-程序员宅基地

文章浏览阅读427次。select count(*) a,b from talble group BY b having count(*)>1 order BY a desc_sql语句中的ü

随便推点

地名经纬度互相转换_bmap 根据名称转经纬度-程序员宅基地

文章浏览阅读2.3k次。//经纬度转化为地名 var coser = new BMap.Geocoder(); coser.getLocation(new BMap.Point(116.401481,39.914776),function(result){ console.log(result); }) //地名转化为经纬度 var coser = new _bmap 根据名称转经纬度

Unity UGUI CanvasGroup组件的详解_unity canvas 中的grp-程序员宅基地

文章浏览阅读6.9k次,点赞4次,收藏8次。对于CanvasGroup组件,我们一定要引起高度重视,它很好用的呢。首先创建一个buttonBig,它很大♂,我将它的image里面的颜色alpha调至一半,颜色稍红。添加CanvasGroup组件然后创建两个小的button。他们都是默认的样子。之后调整大button,使大Button在小Button的上面。然后以大Button为父对象,创建一些UGUI的其他物件,像sli..._unity canvas 中的grp

所谓数据驱动,这个锅技术不能背。-程序员宅基地

文章浏览阅读304次。最近这几年,互联网有俩词挺流行,一个是数据驱动,一个是技术无罪。我们说很多产品决策的依据不是管理者拍脑袋,而是基于数据反馈,这当然是好事情。我们说互联网产生了很多新模式,..._点击提权 caoz

IP地址与子网掩码(网络地址与广播地址相关计算)_10.25.0.1子网掩码-程序员宅基地

文章浏览阅读5.5k次,点赞6次,收藏30次。文章目录一、IP地址1.1 IP地址的概念1.2 IP地址的分类私有地址1.3 IP地址的构成1.4 IP地址查询方式二、子网掩码2.1 子网掩码的概念2.2子网掩码的作用2.3子网掩码换算表三、网络地址四、广播地址五、利用以上内容解决问题一、IP地址1.1 IP地址的概念概念:IP地址是给每个连接在Internet上的主机分配的一个32bit地址。按照TCP/IP协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。包括主机地址和网络地址两部分。所以,IP地址由_10.25.0.1子网掩码

Web 趋势榜:上周不可错过的最热门的 10 大 Web 项目 - 210416-程序员宅基地

文章浏览阅读237次。大家好,我是你们的 猫哥,那个不喜欢吃鱼、又不喜欢喵 的超级猫 ~GitHub 上面有个 Trending 榜 (趋势榜),在 Trending 页面,你可以看到最近一些热门的开源项目或者..._github 一周热门

intel历代架构演进2——NetBurst微架构_intel netburst 微架构-程序员宅基地

文章浏览阅读2.9k次。NetBurst架构提供如下功能:The Rapid Execution Engine— Arithmetic Logic Units (ALUs) run at twice the processor frequency— Basic integer operations can dispatch in 1/2 proces_intel netburst 微架构