STL即 Standard Template Library (標準模板庫) html
STL是惠普實驗室開發的一系列軟件的統稱。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普實驗室工做時所開發出來的。如今雖然說它主要出如今C++中,但在被引入C++以前該技術就已經存在了很長的一段時間。
STL的代碼從廣義上講分爲三類:algorithm(算法)、container(容器)和iterator(迭代器),幾乎全部的代碼都採用了模板類和模版函數的方式,這相比於傳統的由函數和類組成的庫來講提供了更好的代碼重用機會。linux
從根本上說,STL是一些「容器」的集合,這些「容器」有list,vector,set,map等,STL也是算法和其餘一些組件的集合。這裏的「容器」和算法的集合指的是世界上不少聰明人不少年的傑做。
算法
STL的目的是標準化組件,這樣你就不用從新開發它們了。你能夠僅僅使用這些現成的組件。STL如今是C++的一部分,所以不用額外安裝什麼。它被內建在 你的編譯器以內。由於STL的list是一個簡單的容器,因此我打算從它開始介紹STL如何使用。若是你懂得了這個概念,其餘的就都沒有問題了。另外,list容器是至關簡單的,咱們會看到這一點。
這篇文章中咱們將會看到如何定義和初始化一個list,計算它的元素的數量,從一個list裏查找元素,刪除元素,和一些其餘的操做。要做到這些,咱們將會討論兩個不一樣的算法,STL通用算法都是能夠操做不止一個容器的,而list的成員函數是list容器專有的操做。編程
STL容器能夠保存對象,內建對象和類對象。它們會安全的保存對象,並定義咱們可以操做的這個對象的接口。放在蛋架上的雞蛋不會滾到桌上。它們很安全。所以,在STL容器中的對象也很安全。我知道這個比喻聽起來很老土,可是它很正確。
STL算法是標準算法,咱們能夠把它們應用在那些容器中的對象上。這些算法都有很著名的執行特性。它們能夠給對象排序,刪除它們,給它們記數,比較,找出特殊的對象,把它們合併到另外一個容器中,以及執行其餘有用的操做。
STL iterator就象是容器中指向對象的指針。STL的算法使用iterator在容器上進行操做。Iterator設置算法的邊界 ,容器的長度,和其餘一些事情。舉個例子,有些iterator僅讓算法讀元素,有一些讓算法寫元素,有一些則二者都行。 Iterator也決定在容器中處理的方向。
你能夠經過調用容器的成員函數begin()來獲得一個指向一個容器起始位置的iterator。你能夠調用一個容器的 end() 函數來獲得過去的最後一個值(就是處理停在那的那個值)。
這就是STL全部的東西,容器、算法、和容許算法工做在容器中的元素上的iterator。 算法以合適、標準的方法操做對象,並可經過iterator獲得容器精確的長度。一旦作了這些,它們就在也不會「跑出邊界」。還有一些其餘的對這些核心組件類型有功能性加強的組件,例如函數對象。
原文見:http://www.chinalinuxpub.com/doc/pro/stl.html
------------------------------------------------------------------------------------
ATL: Active Template Library (活動模板庫)安全
能夠看一下潘愛民關於《ATL Internals》的書評:
ATL是一個產生C++/COM代碼的框架,就如同C語言是一個產生彙編代碼的框架
ATL又不一樣於MFC,它徹底面向COM組件,其技術路線也不一樣於MFC,MFC使用的是C++中的繼承、封裝、嵌套等常規技術,而ATL使用了C++中模板、多繼承等高級技術,甚至還用到了STL。因此學習和使用ATL要求咱們必須熟悉這些C++高級特性。另外一方面,ATL結構徹底針對COM中的諸多規範,這就要求使用人員必須很是瞭解COM規範,纔有可能真正把ATL用好
對於COM應用的開發,ATL無疑是首選的工具,與MFC相比,ATL的規模還不算大,可是從上述的介紹咱們能夠看出,ATL涉及到了COM的方方面面。 實際上,ATL的內容還要多得多,好比OLE DB的支持、MTS的支持等,儘管如此,若是咱們有了這本書中的內容爲基礎,那麼再去學習這些擴展的內容就會容易得多,結合ATL中實現COM的基本手段 加上這些應用技術的背景知識,咱們能夠很容易地掌握這些開發技術。
可是若是咱們要想熟練掌握甚至精通ATL的話,那麼這只是一個開頭,前面還有漫長的路要走。緣由有多方面,一則COM自己異常複雜,不下苦功難窺全貌;二則ATL確實奧妙不少,它體現了C++語法的博大精深;三則ATL還存在不少錯誤,雖然本書做者指出了一些錯誤,但實際的錯誤確定更多,這就對ATL使用者提出了更高的要求,若是使用過程當中不能發現這些錯誤或者避開這些錯誤,那麼用ATL反而會阻礙咱們的工做。
雖然ATL比較精深,可是這本書的講解很是通俗易懂,語言比較簡練,條理很是清楚。即便在讀完這本書以後,它仍然能夠做爲參考書指導咱們的開發和學習工做。我想,這就是好書的價值所在吧。
----------------------------------------------------------------------------------
WTL:Windows Templat Library
見:http://www.c-view.org/journal/006/wtl.htm服務器
在ATL出現的時候,一些部分COM的編程人員開始以爲開發COM運用是一種快樂,由於使用它很方便地開發小規模的COM組件,但好景不長,現實的COM組件是包羅至關普遍的,特別當它們準備使用窗口控件,發現ATL提供的至關的稀少。所以Microsoft推出了半成品與沒有技術支持的WTL,這也是WTL誕生的緣由。
不少初次接觸WTL都問「WTL這三個字母表明什麼呢?」:WTL全稱爲Windows Template Library,構架於ATL之上,採用C++模板技術來包裝大部窗口控制,並給出一個與MFC類似的應用框架。他們緊跟着問「那我如何獲得它呢?」:因爲WTL是Microsoft推出的,在Microsoft的PlatForm SDK中就有WTL是ATL的擴展,也是由ATL小組開發,包含在Microsoft於2000年1月發佈的開發平臺SDK包中(也能夠從Microsoft網站上下 載),雖然Microsoft沒有正式支持。WTL經過提供一個用於編寫Win32應用程序和控制的輕量級的框架,一些特殊的視圖,GDI對象和實用的 類,來擴展了ATL窗口類WTL設計特性--附帶地,相對於MFC的優點--包括:
模板化,所以有較小的代碼量。例如,一個簡單的「hello world」SDI應用程序,基於WTL的程序只有24KB,而MFC靜態鏈接結果是440KB,MFC動態鏈接的結果是24KB+1MB。
無太多相關性,而且能夠自由地和SDK代碼直接混合。
不會強迫使用特定的應用程序模型,尤爲相對於MFC的應用程序框架。
WTL類包括:
標準控制(編輯框,列表框,按鈕等等)
公共控制(包括列表視圖,樹形視圖,進度條,微調按鈕)
IE控制(rebar,平面滾動條,日曆等等)
命令條,菜單,和更新UI類
公共對話框
屬性單和頁類
框架窗口,MDI框架和子框架,分隔條,可滾動的窗口
設備環境(DC)和GDI對象類(筆、刷子、位圖等)
打印機及其信息和設備模式類
實用工具類:包括CPoint, CRect, CSize, 和CString類
WTL AppWizard容許你生成SDI、MDI、多線程SDI和基於對話框的應用程序。多線程SDI應用程序就象IE或Windows Explorer(個人電腦),看起來象是啓動了多個實例,實質上它們是同一進程的多個視圖。這些視圖能夠是普通的基於CWindowImpl的窗口,或 基於窗體、列表框、編輯框、列表視圖、樹形視圖、豐富文本編輯框或HTML控制。你可讓你的應用程序擁有rebar、命令條(如同Windows CE)、工具條或狀態條。你的應用程序能夠包含ActiveX控制,甚至能夠是一個COM服務器。
WTL = Windows Template Library,能夠說起源於ATL 類庫中關於Window 建立/管理的類。主要緣由是用原始的 WIN32 API 編寫漂亮的用戶界面工做量大,繁雜。MFC 雖然提供了一套很好的封裝,可是也不是很容易消化和使用,特別是各個 MFC 類之間耦合很緊,要用好 MFC 就要理解不少 MFC 內在的運行機制(有人說 MFC 的封裝是「白盒」封裝,呵呵)。WTL 利用 C++ 模版的高級功能,提供很聯繫很鬆散的「獨立」的類庫,使用起來比較方便,並且代碼體積小,沒必要爲了學習某個類必須學習一大堆相關的類。
可是 WTL 不是 Microsoft 官方正式支持的類庫,雖然有至關多的人和愈來愈多的在使用;不過有可能未來會支持的。網絡
________________________________________________數據結構
COM,COM+,OLE,ActiveX,ATL,MFC,STL,WTL 多線程
1. COM: Component Object Model 組件對象模型框架
包含如下兩種組建類型:
OLE: Object Linking and Embedding 帶有特殊接口的COM組件(對象的連接與嵌入),OLE 中與連接和嵌入無關的部分如今已成爲Active 技術的一部分。詳細信息,參考:Core_OLE_Background
ActiveX: 帶有特殊接口的COM組件
(COM對象實現IDispatch通常能夠稱之爲ActiveX,此外ActiveX通常具備界面)
包含以下兩種組件實現方法
ATL
MFC
COM+: COM組建的運行環境,即COM庫
Notes:
ActiveX是Microsoft提出的一組使用COM(Component Object Model,組件對象模型)使
得軟件部件在網絡環境中進行交互的技術集。它與具體的編程語言無關。做爲針對Internet應
用開發的技術,ActiveX被普遍應用於WEB服務器以及客戶端的各個方面。同時,ActiveX技術
也被用於方便地建立普通的桌面應用程序。
ActiveX既包含服務器端技術,也包含客戶端技術。其主要內容是:
* ActiveX控制(ActiveX Control);用於向WEB頁面、Microsoft Word等支持ActiveX
的容器(Container)中插入COM對象。
* ActiveX文檔(ActiveX Document);用於在WEB Browser或者其它支持ActiveX的容器中瀏覽複合文檔(非HTML文檔),例如Microsoft Word文檔,Microsoft Excel文檔或者用戶
定義的文檔等。
* ActiveX腳本描述(ActiveX Scripting);用於從客戶端或者服務器端操縱ActiveX控
制和Java程序,傳遞數據,協調它們之間的操做。
* ActiveX服務器框架(ActiveX Server Framework);提供了一系列針對WEB服務器應 用程序設計各個方面的函數及其封裝類,諸如服務器過濾器、HTML數據流控制等。
* 在Internet Explorer中內置Java虛擬機(Java Virtual Machine),從而使Java Applet 可以在Internet Explorer上運行,並能夠與ActiveX控制經過腳本描述語言進行通訊。
2. ATL: Active Template Library 是開發COM和ActiveX組件的C++模板庫
使用ATL可以快速地開發出高效、簡潔的代碼(Effective and Slim code),同時對COM組件的開發提供最大限度的代碼自動生成以及可視化支持。
入口函數爲 DllMain (進程內組件)
入口函數爲 tWinMain (進程外組件)
入口函數爲 CWinApp (ATL支持MFC)
在ATL產生之前,開發COM組件的方法主要有兩種:一是使用COM SDK直接開發COM組件,另外一種方式是經過MFC提供的COM支持來實現。
首先ATL的基本目標就是使COM應用開發儘量地自動化,這個基本目標就決定了ATL只面向COM開發提供支持。
其次,ATL因其採用了特定的基本實現技術,擺脫了大量冗餘代碼,使用ATL開發出來的COM應用的代碼簡練高效,即所謂的「Slim Code」。
第三,ATL的各個版本對Microsoft的基於COM的各類新的組件技術如MTS、ASP等都有很好的支持,ATL對新技術的反應速度大大快於MFC。ATL已經成爲Microsoft支持COM應用開發的主要開發工具,所以COM技術方面的新進展在很短的時間內都會在ATL中獲得反映。這使開發者使用ATL進行COM編程能夠獲得直接使用COM SDK編程一樣的靈活性和強大的功能。
3. MFC:MFC(Microsoft Foundation Classes),是一個微軟公司提供的類庫(class libraries),以C++類的形式封裝了Windows的API,而且包含一個應用程序框架,以減小應用程序開發人員的工做量。其中包含的類包含大量Windows句柄封裝類和不少Windows的內建控件和組件的封裝類。
4. STL: Standard Template Library 標準C++程序開發的模板庫
是惠普實驗室開發的一系列軟件的統稱,做爲ANSI/ISO C++的一部分,已經被C++標準委員會正式採納。STL的一個重要特色是數據結構和算法的分離,這使其很是通用。另外一個重要特性爲不是面向對象的,爲了實現通用性。
STL有6大組件:algorithm(算法)、container(容器)、iterator(迭代器)、function object(函數對象)、adaptors(適配器)和allocator(記憶體配置器),其中最主要的是前三個組件。
___________________________________________
下面是一篇挺有意思的文章 講MFC與ATL的關係 就如男人和女兒的關係
男女關係
若是從哲學的觀點來看,這大概要說是一種辯證關係了!
首先談談男人。男人與男孩的區別在於責任,對於一個男人來講,他的肩膀永遠有負擔,他要解決生活中遇到的全部問題,能夠爲妻兒帶來幸福生活,能夠贍養父母,能夠作一些成就來創一番事業。因此男人不要輕生,由於你垮下就意味着你的負擔沒有了支撐,也就是你不負責任。男人的這種責任體現了一種剛性,打不倒壓不垮,坎坎坷坷一路走來即便沒有揚名立萬可是肩膀上的負擔始終沒有落下。錚錚鐵骨、鐵血男兒、陽剛之美都是對男人的讚美,一個家庭男人是頂樑柱,這就是責任。
再談談女人。女人與女孩的區別在於柔情,少了撒嬌和任性,多了體貼和溫柔。女人是生活的調劑品,少了她儘管能夠填抱肚皮、補充養分但食之無味。女人天生就是善於交際的,這自己體現的就是一種柔性,就像太極同樣,以柔克剛,藉助剛性體現柔美。
用建築來形容男女關係,男人就像鋼筋水泥搭建起來的框架承受着外力,女人則是對框架填補裝修使其美觀,不一樣的男人有着不一樣的建築風格,不一樣的女人可使建築呈現不一樣的美。成功的男人背後都有一個女人,鋼筋水泥加上精心裝飾讓人體會到設計之美,至於誰重要次要,誰表誰裏都不是關鍵,關鍵的是剛柔的結合。
MFC
MFC是一個男人,從Microsoft C/C++ version 7.0到Visual Stduio.net 2005一直承擔着軟件框架設計的角色,風風雨雨路不回頭,屹立在軟件設計大道,爲開發者提供便利,著名的BCG庫和XTREME庫都是在MFC源碼基礎上的改進。它大而繁雜,曲折通幽,粗曠豪放。它必須承擔責任,提供軟件設計的一套解決方案,並且揹負着歷史包袱,因此不免帶有一些成熟男人的深邃而不被人理解。若是你還一味的去批判它,那隻能說你不懂男人的心,不理解一個男人難言之苦。 ATL
ATL是一個女人,小巧靈活討人喜好,它做爲COM思想的實現而拿出來解決軟件協做的問題。它能夠不具體實現功能而只留出一些接口,接口兩端相通而且隨時拔插,多麼完美一個女人!爲一個C++對象配備一個ATL對象你能夠想象有什麼結果嘛?
軟件設計中的MFC與ATL
之前我一直覺得ATL就是作控件、構造插件接口體系的,而MFC就是用來作界面功能。它們屬於不一樣體系,在功能級別上存在差別,因此只是在縱向上結合而沒有嘗試橫向的結合。人類社會是天然的,軟件社會也應該是天然的。天然表明一種隨和,親近,協調。
提到MFC,八九不離十就涉及到軟件界面開發。目前來講軟件複用需求愈來愈高,而軟件功能的不肯定因素愈來愈大,一個特定的界面行爲可能不肯定。MFC是一個男人,用它能夠作任何想作的界面,這就是它的剛性。可是咱們究竟是要去作什麼仍是告訴別人咱們能夠作什麼呢?若是咱們一味的作,那咱們充其量只是一個莽夫,是呂布有勇無謀。我告訴你我有一個MFC對象,還告訴你它能夠作什麼,這樣不就夠了。
MFC是男人天生缺少溝通能力,因此沒法告知外界它自身的行爲,只有它本身知道。這時候就須要一個管子插到對象內部去了解它,而ATL恰好提供了一個接口,將其一段插入MFC對象內部而露出另外一端以便告知外界MFC對象內部的行爲。這樣的界面是可解釋的界面,它具備作事情的能力,可是它不去作,而成爲可複用界面。