青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Wood_K
See gull
posts - 3,  comments - 7,  trackbacks - 0

作為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) (與迭代器配合使用)

posted on 2009-08-27 00:36 Wood_K 閱讀(3660) 評論(1)  編輯 收藏 引用 所屬分類: 算法基礎

FeedBack:
# re: c++中STL庫 簡介 及 使用說明
2012-07-25 21:22 | hxn
使用命名空間的初衷是避免變量同名,在將其全局化不會很方便  回復  更多評論
  

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



<2009年5月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

常用鏈接

留言簿(1)

隨筆檔案

文章分類

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美午夜精彩| 亚洲大片一区二区三区| 亚洲最新视频在线播放| 亚洲成人在线网站| 欧美成人免费在线| 一本色道久久加勒比精品| 亚洲国产精品视频| 欧美韩日一区二区| 99国产精品久久久久老师| 亚洲巨乳在线| 国产精品毛片va一区二区三区| 亚洲欧美日韩精品一区二区 | 在线亚洲免费| 亚洲视频久久| 在线播放豆国产99亚洲| 最新国产成人在线观看| 国产精品国产三级国产a| 欧美制服丝袜第一页| 久久综合久久美利坚合众国| 日韩视频在线你懂得| 亚洲在线一区| 亚洲激情六月丁香| 亚洲一区二区三区精品在线| 在线观看成人小视频| 亚洲精品欧洲| 国产真实乱子伦精品视频| 亚洲国产日韩欧美一区二区三区| 国产精品成人在线观看| 久久综合色一综合色88| 欧美日韩在线大尺度| 久久亚洲国产精品日日av夜夜| 欧美精品在线免费| 久久久久久久激情视频| 欧美日韩国产另类不卡| 久久视频精品在线| 国产精品爱久久久久久久| 噜噜噜躁狠狠躁狠狠精品视频| 欧美日韩一区在线播放| 美国成人直播| 国产精品久久久久天堂| 欧美激情一区二区三区蜜桃视频 | 国产精品亚洲综合久久| 欧美高清视频一区二区三区在线观看 | 久久久久久久网站| 欧美日韩亚洲另类| 欧美成人国产| 黄色小说综合网站| 香港久久久电影| 亚洲综合精品| 欧美日韩一区二区三区四区在线观看 | 亚洲美女av网站| 久久人人爽人人爽| 久久精品中文| 国产欧美精品日韩| 中文欧美字幕免费| 亚洲精品一区在线观看| 久久嫩草精品久久久精品一| 欧美一区二区三区精品电影| 国产精品激情av在线播放| 最近中文字幕mv在线一区二区三区四区| 国产午夜精品福利| 亚洲欧美久久久| 午夜亚洲性色视频| 国产精品视频1区| 国产精品99久久久久久www| 一区二区三区四区五区在线| 欧美成人黑人xx视频免费观看| 你懂的视频一区二区| 国内自拍亚洲| 久久久久亚洲综合| 久久午夜av| 亚洲第一级黄色片| 欧美不卡福利| 日韩亚洲国产精品| 亚洲欧美日韩一区二区三区在线观看| 欧美日韩日本视频| 亚洲曰本av电影| 久久精品99国产精品日本| 国产一区二区三区四区| 久久精品成人欧美大片古装| 免费成人高清| 亚洲免费观看高清在线观看| 欧美日本精品| 亚洲免费在线看| 久久精品视频在线| 亚洲国产综合视频在线观看| 欧美国产日产韩国视频| 亚洲欧洲一区二区在线播放| 中文日韩欧美| 国产午夜精品在线| 久久综合激情| 国产精品99久久久久久久久| 欧美专区18| 亚洲免费观看| 国产美女在线精品免费观看| 久久亚洲国产精品日日av夜夜| 亚洲成在线观看| 亚洲一区欧美一区| 在线成人中文字幕| 欧美日韩一区二区三区免费看 | 一区二区三区不卡视频在线观看| 亚洲欧美日韩在线不卡| 国产原创一区二区| 欧美精品日韩综合在线| 欧美一区二区女人| 亚洲精品偷拍| 美女被久久久| 亚洲影视中文字幕| 亚洲第一页自拍| 国产精品免费一区二区三区在线观看| 欧美一区视频| 一区二区日韩| 欧美激情第1页| 久久久久久夜| 亚洲资源在线观看| 亚洲风情在线资源站| 国产精品亚洲激情| 欧美日韩国产三级| 久久一区亚洲| 性欧美xxxx大乳国产app| 日韩午夜电影在线观看| 亚洲成色www8888| 久久亚洲欧美国产精品乐播| 亚洲视频精选| 亚洲毛片在线观看.| 一区二区三区在线看| 国产日韩精品在线观看| 欧美色一级片| 欧美色道久久88综合亚洲精品| 欧美a级大片| 久久免费少妇高潮久久精品99| 亚洲欧美日韩中文播放| 日韩视频―中文字幕| 亚洲国产精品小视频| 欧美成人伊人久久综合网| 久久综合狠狠综合久久综青草| 午夜精品福利视频| 亚洲男人的天堂在线aⅴ视频| 日韩一级片网址| 亚洲精品美女在线观看播放| 亚洲国产一区二区a毛片| 狠狠色狠色综合曰曰| 狠狠色综合网站久久久久久久| 国产欧美日韩亚洲精品| 国产欧美日韩精品丝袜高跟鞋 | 久久免费精品日本久久中文字幕| 亚洲永久字幕| 欧美一区二区精品| 久久成人免费电影| 久久九九免费| 老司机久久99久久精品播放免费| 看片网站欧美日韩| 欧美成人蜜桃| 欧美色综合天天久久综合精品| 欧美日韩一区在线| 国产精品一区2区| 国际精品欧美精品| 亚洲成在线观看| 日韩一二三区视频| 亚洲主播在线| 久久久一区二区| 亚洲福利久久| 日韩午夜在线播放| 亚洲性视频网址| 欧美在线观看视频| 欧美aaa级| 国产精品国产三级国产aⅴ无密码| 国产精品欧美在线| 伊人久久婷婷| 亚洲天堂免费在线观看视频| 欧美一区不卡| 欧美激情一区二区三区不卡| 日韩视频在线一区二区| 性高湖久久久久久久久| 狼人天天伊人久久| 国产精品成人一区二区艾草| 国产亚洲视频在线观看| 亚洲精品午夜精品| 欧美亚洲免费电影| 欧美激情精品久久久六区热门| 一区二区成人精品| 久久久www成人免费毛片麻豆| 欧美高潮视频| 国模精品一区二区三区| 在线亚洲欧美视频| 久久躁日日躁aaaaxxxx| 一二美女精品欧洲| 久久中文字幕一区| 国产麻豆精品theporn| 最新日韩在线| 久久免费黄色| 亚洲无线一线二线三线区别av| 麻豆成人精品| 国产日韩成人精品| 亚洲特黄一级片| 欧美.日韩.国产.一区.二区| 亚洲午夜在线观看| 欧美日韩不卡视频| 亚洲国产一区二区三区在线播 | 一区二区毛片|