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

隨筆 - 25  文章 - 29  trackbacks - 0
<2006年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用鏈接

留言簿(4)

隨筆分類(22)

隨筆檔案(25)

文章分類(2)

文章檔案(2)

相冊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 57448
  • 排名 - 406

最新評論

閱讀排行榜

評論排行榜

C++ STL簡介
原創(chuàng):怒火之袍 2002年10月28日

一、STL簡介

STL(Standard Template Library,標(biāo)準(zhǔn)模板庫)是惠普實(shí)驗(yàn)室開發(fā)的一系列軟件的統(tǒng)稱。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普實(shí)驗(yàn)室工作時所開發(fā)出來的。現(xiàn)在雖說它主要出現(xiàn)在C++中,但在被引入C++之前該技術(shù)就已經(jīng)存在了很長的一段時間。

STL的代碼從廣義上講分為三類:algorithm(算法)、container(容器)和iterator(迭代器),幾乎所有的代碼都采用了模板類和模版函數(shù)的方式,這相比于傳統(tǒng)的由函數(shù)和類組成的庫來說提供了更好的代碼重用機(jī)會。在C++標(biāo)準(zhǔn)中,STL被組織為下面的13個頭文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。以下筆者就簡單介紹一下STL各個部分的主要特點(diǎn)。

二、算法

大家都能取得的一個共識是函數(shù)庫對數(shù)據(jù)類型的選擇對其可重用性起著至關(guān)重要的作用。舉例來說,一個求方根的函數(shù),在使用浮點(diǎn)數(shù)作為其參數(shù)類型的情況下的可重用性肯定比使用整型作為它的參數(shù)類性要高。而C++通過模板的機(jī)制允許推遲對某些類型的選擇,直到真正想使用模板或者說對模板進(jìn)行特化的時候,STL就利用了這一點(diǎn)提供了相當(dāng)多的有用算法。它是在一個有效的框架中完成這些算法的——你可以將所有的類型劃分為少數(shù)的幾類,然后就可以在模版的參數(shù)中使用一種類型替換掉同一種類中的其他類型。

STL提供了大約100個實(shí)現(xiàn)算法的模版函數(shù),比如算法for_each將為指定序列中的每一個元素調(diào)用指定的函數(shù),stable_sort以你所指定的規(guī)則對序列進(jìn)行穩(wěn)定性排序等等。這樣一來,只要我們熟悉了STL之后,許多代碼可以被大大的化簡,只需要通過調(diào)用一兩個算法模板,就可以完成所需要的功能并大大地提升效率。

算法部分主要由頭文件<algorithm>,<numeric>和<functional>組成。<algorithm>是所有STL頭文件中最大的一個(盡管它很好理解),它是由一大堆模版函數(shù)組成的,可以認(rèn)為每個函數(shù)在很大程度上都是獨(dú)立的,其中常用到的功能范圍涉及到比較、交換、查找、遍歷操作、復(fù)制、修改、移除、反轉(zhuǎn)、排序、合并等等。<numeric>體積很小,只包括幾個在序列上面進(jìn)行簡單數(shù)學(xué)運(yùn)算的模板函數(shù),包括加法和乘法在序列上的一些操作。<functional>中則定義了一些模板類,用以聲明函數(shù)對象。

三、容器

在實(shí)際的開發(fā)過程中,數(shù)據(jù)結(jié)構(gòu)本身的重要性不會遜于操作于數(shù)據(jù)結(jié)構(gòu)的算法的重要性,當(dāng)程序中存在著對時間要求很高的部分時,數(shù)據(jù)結(jié)構(gòu)的選擇就顯得更加重要。

經(jīng)典的數(shù)據(jù)結(jié)構(gòu)數(shù)量有限,但是我們常常重復(fù)著一些為了實(shí)現(xiàn)向量、鏈表等結(jié)構(gòu)而編寫的代碼,這些代碼都十分相似,只是為了適應(yīng)不同數(shù)據(jù)的變化而在細(xì)節(jié)上有所出入。STL容器就為我們提供了這樣的方便,它允許我們重復(fù)利用已有的實(shí)現(xiàn)構(gòu)造自己的特定類型下的數(shù)據(jù)結(jié)構(gòu),通過設(shè)置一些模版類,STL容器對最常用的數(shù)據(jù)結(jié)構(gòu)提供了支持,這些模板的參數(shù)允許我們指定容器中元素的數(shù)據(jù)類型,可以將我們許多重復(fù)而乏味的工作簡化。

容器部分主要由頭文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>組成。對于常用的一些容器和容器適配器(可以看作由其它容器實(shí)現(xiàn)的容器),可以通過下表總結(jié)一下它們和相應(yīng)頭文件的對應(yīng)關(guān)系。

數(shù)據(jù)結(jié)構(gòu) 描述 實(shí)現(xiàn)頭文件
向量(vector) 連續(xù)存儲的元素 <vector>
列表(list) 由節(jié)點(diǎn)組成的雙向鏈表,每個結(jié)點(diǎn)包含著一個元素 <list>
雙隊(duì)列(deque) 連續(xù)存儲的指向不同元素的指針?biāo)M成的數(shù)組 <deque>
集合(set) 由節(jié)點(diǎn)組成的紅黑樹,每個節(jié)點(diǎn)都包含著一個元素,節(jié)點(diǎn)之間以某種作用于元素對的謂詞排列,沒有兩個不同的元素能夠擁有相同的次序 <set>
多重集合(multiset) 允許存在兩個次序相等的元素的集合 <set>
棧(stack) 后進(jìn)先出的值的排列 <stack>
隊(duì)列(queue) 先進(jìn)先出的執(zhí)的排列 <queue>
優(yōu)先隊(duì)列(priority_queue) 元素的次序是由作用于所存儲的值對上的某種謂詞決定的的一種隊(duì)列 <queue>
映射(map) 由{鍵,值}對組成的集合,以某種作用于鍵對上的謂詞排列 <map>
多重映射(multimap) 允許鍵對有相等的次序的映射 <map>

四、迭代器

下面要說的迭代器從作用上來說是最基本的部分,可是理解起來比前兩者都要費(fèi)力一些(至少筆者是這樣)。軟件設(shè)計有一個基本原則,所有的問題都可以通過引進(jìn)一個間接層來簡化,這種簡化在STL中就是用迭代器來完成的。概括來說,迭代器在STL中用來將算法和容器聯(lián)系起來,起著一種黏和劑的作用。幾乎STL提供的所有算法都是通過迭代器存取元素序列進(jìn)行工作的,每一個容器都定義了其本身所專有的迭代器,用以存取容器中的元素。

迭代器部分主要由頭文件<utility>,<iterator>和<memory>組成。<utility>是一個很小的頭文件,它包括了貫穿使用在STL中的幾個模板的聲明,<iterator>中提供了迭代器使用的許多方法,而對于<memory>的描述則十分的困難,它以不同尋常的方式為容器中的元素分配存儲空間,同時也為某些算法執(zhí)行期間產(chǎn)生的臨時對象提供機(jī)制,<memory>中的主要部分是模板類allocator,它負(fù)責(zé)產(chǎn)生所有容器中的默認(rèn)分配器。

五、對初學(xué)者學(xué)習(xí)STL的一點(diǎn)建議

對于之前不太了解STL的讀者來說,上面的文字只是十分概括地描述了一下STL的框架,對您理解STL的機(jī)制乃至使用STL所起到的幫助微乎甚微,這不光是因?yàn)樯钊隨TL需要對C++的高級應(yīng)用有比較全面的了解,更因?yàn)镾TL的三個部分算法、容器和迭代器三部分是互相牽制或者說是緊密結(jié)合的。從概念上講最基礎(chǔ)的部分是迭代器,可是直接學(xué)習(xí)迭代器會遇到許多抽象枯燥和繁瑣的細(xì)節(jié),然而不真正理解迭代器又是無法直接進(jìn)入另兩部分的學(xué)習(xí)的(至少對剖析源碼來說是這樣)。可以說,適應(yīng)STL處理問題的方法是需要花費(fèi)一定的時間的,但是以此為代價,STL取得了一種十分可貴的獨(dú)立性,它通過迭代器能在盡可能少地知道某種數(shù)據(jù)結(jié)構(gòu)的情況下完成對這一結(jié)構(gòu)的運(yùn)算,所以下決心鉆研STL的朋友們千萬不要被一時的困難擊倒。其實(shí)STL運(yùn)用的模式相對統(tǒng)一,只要適應(yīng)了它,從一個STL工具到另一個工具,都不會有什么大的變化。

對于STL的使用,也普遍存在著兩種觀點(diǎn)。第一種認(rèn)為STL的最大作用在于充當(dāng)經(jīng)典的數(shù)據(jù)結(jié)構(gòu)和算法教材,因?yàn)樗脑创a涉及了許多具體實(shí)現(xiàn)方面的問題。第二種則認(rèn)為STL的初衷乃是為了簡化設(shè)計,避免重復(fù)勞動,提高編程效率,因此應(yīng)該是“應(yīng)用至上”的,對于源代碼則不必深究。筆者則認(rèn)為分析源代碼和應(yīng)用并不矛盾,通過分析源代碼也能提高我們對其應(yīng)用的理解,當(dāng)然根據(jù)具體的目的也可以有不同的側(cè)重。

最后要說的是,STL是ANSI/ISO C++標(biāo)準(zhǔn)的一部分,所以對于一個可以有多種C++實(shí)現(xiàn)的過程,首先考慮的應(yīng)該是STL提供的模板(高效且可移植性好),其次才是各個廠商各自相應(yīng)的庫(高效但可移植性不好)以及自己去編寫代碼(可移植性好但低效)。

posted on 2006-05-31 10:01 黃大仙 閱讀(1417) 評論(1)  編輯 收藏 引用 所屬分類: c++

FeedBack:
# re: C++ STL簡介(轉(zhuǎn)載) 2006-09-05 16:34 xue
好的引導(dǎo)
謝謝  回復(fù)  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              亚洲天堂网在线观看| 久久久综合激的五月天| 影音先锋欧美精品| 国产精品蜜臀在线观看| 欧美巨乳在线| 免费成人高清| 久久九九久久九九| 亚洲午夜视频| 一本色道久久88亚洲综合88| 欧美激情一区二区三区不卡| 久久久久国产精品一区| 欧美一区二区视频在线观看| 亚洲婷婷综合久久一本伊一区| 亚洲国产一区视频| 在线免费观看日本欧美| 国产亚洲精品v| 国产美女搞久久| 国产精品青草综合久久久久99| 欧美另类99xxxxx| 欧美激情中文字幕乱码免费| 欧美1区2区| 欧美成人中文| 欧美黄色一区| 欧美激情区在线播放| 欧美成ee人免费视频| 麻豆国产精品va在线观看不卡| 久久裸体艺术| 看片网站欧美日韩| 麻豆免费精品视频| 免费看的黄色欧美网站| 免费观看一区| 欧美国产免费| 欧美日韩精品免费观看| 欧美日韩综合不卡| 国产精品久久久久久久久久直播| 欧美性理论片在线观看片免费| 欧美日韩综合不卡| 国产精品激情| 国产欧美亚洲一区| 国内精品视频在线观看| 一区二区亚洲精品国产| 亚洲福利一区| 9久草视频在线视频精品| 亚洲天堂偷拍| 欧美一区=区| 另类激情亚洲| 亚洲国产美女| 一区二区三区欧美成人| 午夜欧美精品久久久久久久| 久久精品视频在线看| 麻豆成人在线| 国产精品chinese| 亚洲美女色禁图| 宅男噜噜噜66一区二区| 国内久久视频| 亚洲国产婷婷香蕉久久久久久99 | 国产视频一区在线| 一区二区三区中文在线观看 | 一本色道久久综合精品竹菊 | 亚洲福利一区| 在线视频欧美一区| 午夜免费在线观看精品视频| 久久婷婷综合激情| 亚洲国产视频直播| 亚洲综合999| 猛干欧美女孩| 国产精品久久77777| 又紧又大又爽精品一区二区| 99精品国产在热久久下载| 亚洲欧美在线aaa| 免费h精品视频在线播放| 亚洲另类自拍| 久久久精品国产99久久精品芒果| 欧美精品成人| 国内精品久久国产| 亚洲视频大全| 欧美成人乱码一区二区三区| 一区二区国产日产| 久久综合狠狠综合久久激情| 欧美视频网址| 亚洲欧洲日韩在线| 久久av资源网站| 亚洲另类自拍| 久久久久女教师免费一区| 国产精品初高中精品久久| 在线不卡中文字幕播放| 午夜精品美女久久久久av福利| 欧美成人免费一级人片100| 亚洲影视在线播放| 欧美人妖在线观看| 亚洲丁香婷深爱综合| 欧美资源在线观看| 日韩视频精品在线| 蜜桃精品久久久久久久免费影院| 国产精品网站在线| 99在线热播精品免费99热| 你懂的亚洲视频| 性欧美18~19sex高清播放| 欧美午夜在线观看| 日韩一级精品| 欧美激情四色 | 国产精品视频最多的网站| 亚洲麻豆一区| 欧美成人首页| 久久久免费精品| 国产一区二区三区在线播放免费观看| 亚洲深夜福利视频| 亚洲精品视频二区| 欧美电影免费观看高清| 伊人色综合久久天天五月婷| 久久久久国色av免费看影院| 亚洲淫性视频| 国产精品美女一区二区| 亚洲视频高清| 亚洲精品日韩欧美| 欧美激情aaaa| 日韩天堂在线观看| 最新国产乱人伦偷精品免费网站| 久久人体大胆视频| 亚洲第一综合天堂另类专| 麻豆精品在线视频| 久久久另类综合| 一区二区三区无毛| 久久久久久久999| 欧美亚洲三级| 国产综合激情| 久久综合色88| 久久婷婷国产综合国色天香| **网站欧美大片在线观看| 午夜精品久久久久久久99热浪潮 | 亚洲一区久久| 国产精品一区二区在线观看不卡| 亚洲新中文字幕| 亚洲视频国产视频| 国产老肥熟一区二区三区| 久久国产精品色婷婷| 久久av红桃一区二区小说| 国产一区亚洲| 欧美国产日本高清在线| 欧美承认网站| 亚洲图中文字幕| 亚洲欧美视频一区| 韩国女主播一区| 亚洲第一精品电影| 欧美日韩专区在线| 欧美一区二区三区精品电影| 欧美一区二区成人| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲国产专区| 国产精品乱码久久久久久| 久久精品人人做人人综合| 久久九九精品99国产精品| 亚洲激情在线激情| 99伊人成综合| 国产一区日韩欧美| 亚洲电影免费| 国产精品久久久久久久久免费樱桃 | 米奇777在线欧美播放| 99精品99| 午夜精品久久久久久久99樱桃| 在线观看欧美成人| 99re热这里只有精品免费视频| 国产精品久久久久久久久果冻传媒| 久久精品国产清高在天天线| 免费精品视频| 新片速递亚洲合集欧美合集| 久久久久**毛片大全| 日韩午夜av| 欧美诱惑福利视频| 一本色道久久综合| 久久国产精品免费一区| 一区二区三区不卡视频在线观看| 欧美一级视频精品观看| 亚洲伦理精品| 久久精品噜噜噜成人av农村| 一区二区三区日韩在线观看| 欧美一级电影久久| 一个色综合导航| 久久久久免费视频| 亚洲综合大片69999| 久热精品在线视频| 欧美一区二区视频97| 欧美国产先锋| 久久一区二区三区超碰国产精品| 欧美日韩精品一区二区三区| 麻豆成人在线观看| 国产精品亚洲网站| 日韩视频精品在线| 亚洲激情视频在线| 欧美中文字幕在线播放| 亚洲尤物在线视频观看| 欧美成人午夜激情| 美国成人直播| 国产视频在线观看一区二区三区 | 国产精品日本欧美一区二区三区| 欧美国产在线观看| 国产综合婷婷| 亚洲欧美一区二区三区极速播放| 中文精品视频| 欧美国产一区在线|