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