CSTL程式設計輕鬆入門

2022-12-26 13:33:04 字數 4943 閱讀 9778

為c++標準不可缺少的一部分,stl應該是滲透在c++程式的角角落落裡的。stl不是實驗室裡的寵兒,也不是程式設計師桌上的擺設,她的激動人心並非曇花一現。本教程旨在傳播和普及stl的基礎知識,若能藉此機會為stl的推廣做些力所能及的事情,到也是件讓人愉快的事情。

1 初識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(standardtemplate library),即標準模板庫,是乙個具有工業強度的,高效的c++程式庫。它被容納於c++標準程式庫(c++ standard library)中,是ansi/iso c++標準中最新的也是極具革命性的一部分。該庫包含了諸多在電腦科學領域裡所常用的基本資料結構和基本演算法。

為廣大c++程式設計師們提供了乙個可擴充套件的應用框架,高度體現了軟體的可復用性。這種現象有些類似於microsoftvisual c++中的mfc(microsoft foundation class library),或者是borlandc++ 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 & lee,前者是指alexander stepanov,stl的創始人;而後者是meng lee,她也是使stl得以推行的功臣,第乙個stl成品就是他們合作完成的。這一提法源自2023年3月,'s journal特約記者, 著名技術書籍作家al stevens對alexander stepanov的一篇專訪。

1.2 追根溯源:stl的歷史

在結識新朋友的時候,大多數人總是忍不住想了解對方的過去。本節將帶您簡單回顧一下stl的過去。

被譽為stl之父的alexander stepanov,出生於蘇聯莫斯科,早在20世紀70年代後半期,他便已經開始考慮,在保證效率的前提下,將演算法從諸多具體應用之中抽象出來的可能性,這便是後來泛型化思想的雛形。為了驗證自己的思想,他和紐約州立大學教授deepak kapur,倫塞里爾技術學院教授d**id musser共同開發了一種叫做tecton的語言。儘管這次嘗試最終沒有取得實用性的成果,但卻給了stepanov很大的啟示。

在隨後的幾年中,他又和d**id musser等人先後用schema語言(一種lisp語言的變種)和ada語言建立了一些大型程式庫。這其間,alexander stepanov開始意識到,在當時的物件導向程式設計思想中所存在的一些問題,比如抽象資料型別概念所存在的缺陷。stepanov希望通過對軟體領域中各組成部分的分類,逐漸形成一種軟體設計的概念性框架。

2023年左右,在貝爾實驗室工作的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)的抽象。

2023年,alexander stepanov開始進入惠普的palo alto實驗室工作,在隨後的4年中,他從事的是有關磁碟驅動器方面的工作。直到2023年,由於參加並主持了實驗室主任bill worley所建立的乙個有關演算法的研究專案,才使他重新回到了泛型化演算法的研究工作上來。專案自建立之後,參與者從最初的8人逐漸減少,最後只剩下兩個人--stepanove本人和meng lee。

經過長時間的努力,最終,信念與汗水所換來的是乙個包含有大量資料結構和演算法部件的龐大執行庫。這便是現在的stl的雛形(同時也是stl的乙個實現版本--hp stl)。

2023年,當時在貝爾實驗室的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也在不斷地作著相應的演化。直至2023年,ansi/iso c++標準正式定案,stl始終是c++標準中不可或缺的一大部件。

1.3 千絲萬縷的聯絡

在你了解了stl的過去之後,一些名詞開始不斷在你的大腦中浮現,stl、c++、c++標準函式庫、泛型程式設計、物件導向程式設計……,這些概念意味著什麼?他們之間的關係又是什麼?如果你想了解某些細節,這裡也許有你希望得到的答案。

1.3.1 stl和c++

沒有c++語言就沒有stl,這麼說毫不為過。一般而言,stl作為乙個泛型化的資料結構和演算法庫,並不牽涉具體語言(當然,在c++裡,它被稱為stl)。也就是說,如果條件允許,用其他語言也可以實現之。

這裡所說的條件,主要是指類似於"模板"這樣的語法機制。如果你沒有略過前一節內容的話,應該可以看到,alexander stepanov在選擇c++語言作為實現工具之前,早以採用過多種程式語言。但是,為什麼最終還是c++幸運的承擔了這個歷史性任務呢?

原因不僅在於前述那個條件,還在於c++在某些方面所表現出來的優越特性,比如:高效而靈活的指標。但是如果把c++作為一種oop(object-oriented programming,物件導向程式設計)語言來看待的話(事實上我們一般都是這麼認為的,不是嗎?

),其功能強大的繼承機制卻沒有給stl的實現幫上多大的忙。在stl的源**裡,並沒有太多太複雜的繼承關係。繼承的思想,甚而物件導向的思想,還不足以實現類似stl這樣的泛型庫。

c++只有在引入了"模板"之後,才直接導致了stl的誕生。這也正是為什麼,用其他比c++更純的物件導向語言無法實現泛型思想的乙個重要原因。當然,事情總是在變化之中,像j**a在這方面,就是乙個很好的例子,jdk1.

4中已經加入了泛型的特性。

此外,stl對於c++的發展,尤其是模板機制,也起到了促進作用。比如:模板函式的偏特化(template function partial specialization),它被用於在特定應用場合,為一般模板函式提供一系列特殊化版本。

這一特性是繼stl被ansi/iso c++標準委員會通過之後,在bjarne和stepanov共同商討之下並由bjarne向委員會提出建議的,最終該項建議被通過。這使得stl中的一些演算法在處理特殊情形時可以選擇非一般化的方式,從而保證了執行的效率。

XSLT輕鬆入門

xslt輕鬆入門第一章 xslt概念 作者 阿捷 前言 大家好,從今天起我們將一起來學習xml家族的另一種語言xslt,xslt類似html中的css,但是比css功能要強大的多。學習xslt的前提是您對xml已經有一些了解,如果您沒有學習過xml,可以先點這裡 看我先前寫的一篇文章 xml輕鬆入門...

MT4程式設計入門

mt4程式設計入門 一 mt4自定義指標的基本操作 mt4自定義指標的儲存目錄 指標編緝器與指標呼叫 一 mt4自定義指標儲存在c program files metatrader 4 experts indicators這個目錄中,該目錄中主要有二種型別的檔案,一種是mq4檔案,這是mt4自定義指...

linuxShell指令碼程式設計入門例項講解詳解

為什麼要進行shell程式設計 在linux系統中,雖然有各種各樣的圖形化介面工具,但是sell仍然是乙個非常靈活的工具。shell不僅僅是命令的收集,而且是一門非常棒的程式語言。您可以通過使用shell使大量的任務自動化,shell特別擅長系統管理任務,尤其適合那些易用性 可維護性和便攜性比效率更...