程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 關於MFC和STL的使用

關於MFC和STL的使用

編輯:關於VC++

問題:

我在幾個不同的地方讀過有關STL的內容,但還是不知道在我的應用程序中到底是用STL還是用MFC?我的程序也處理string,vectors等東西。使用STL和MFC到底有什麼不同?

解答:

要回答“我應該使用哪一個?”這樣的問題,答案幾乎都一樣。它依賴於你想做什麼,你的應用程序的種類以及你的知識。還有你的C++資格認證也很重要。當你需要快速做某件事情時,最好是利用你最熟悉的工具。如果你想要處理文本,而你有熟悉MFC的話,CString為首選。如果你熟悉STL,那就用string取代MFC。在這個世界上,你選擇哪一個並不重要。使用string,list,或者大把的類都一樣可以做好。但是有時要說這個或者哪個系統更好需要時間。例如,最近的一篇文章中有個例子程序RECYCLE,其中我就是用了STL,為什麼呢?

當我開始寫這個程序時,我將它寫成一個MFC的控制台應用——只因為我已經由一個寫好的模板控制台應用。但是重新看了代碼之後(你肯定也常常遇到這種情況)。我使用的都是MFC的CString和CstringList。因為程序要解析命令行參數,RECYCLE要建立一個刪除文件的名字列表,文件名字都是CString類型的。如果僅僅為了處理串和列表而鏈接MFC的話似乎有些浪費資源。CStringList需要引入整個afxcoll.obj,CString需要加載strcore.obj,並且AfxWinInit肯定要初始化需要的模塊。如果你不看映射文件,你絕對想象不到MFC要加載些什麼東西。其實根本不用看,我就知道RECYCLE應該使用STL效率更高。

為了將程序轉換到STL並刪除所有MFC的跟蹤代碼,我只要改為數不多的幾行代碼就可以了。首先,我#include和,然後為方便起見,添加一個類型定義:

// 串列表

typedef list CStringList;

只有名字與MFC相同,而接口已經完全變了。尤其是STL使用iterators代替了POSITIONs。

CStringList files; // 文件名字列表

CStringList::iterator i;

for (i=files.begin(); i!=files.end(); i++) {

}

比較之下,我發現STL的iterators比MFC的POSITIONs更容易記憶。不知什麼原因,我總是記不住POSITIONs的使用方法,每次總是要去查手冊,而begin/end 和 i++語法對我來說輕車熟路。另一方面,我希望STL有一個轉換函數用於將string轉成LPCTSTR,就像CString那樣:

CString s; // MFC

LPCTSTR pstr = s; // 調用 "CString::operator LPCTSTR() const;"

MFC的轉換函數很棒,使用它可以將某個CString傳到任何可以傳指針的的C串中。可以讓你寫如下的代碼:

CString s = "whatever";

MyFunc(s); // MyFunc 想要 LPCTSTR

而如果使用STL,你必須顯式地調用string::c_str.

string s;

MyFunc(s.c_str());

也許STL的設計者認為轉換函數容易引起混亂,確實是這樣,正是因為如此才造就了整個STL設計。每次只要已涉及到STL代碼就犯難,主要的問題是類型。使用STL的一個更重要的理由當然是可移植性。STL是C++標准的一部分,就像printf,,tolower,strcpy等是C標准的一部分一樣。我總是感覺到可移植性有一些問題,因為大多數程序它依賴於平台。其它操作系統有

SHFileOperation嗎?沒有。然而,盡可能將平台依賴程度降至最小,STL能幫你做到。任何想要與ANSI兼容的編譯器必須支持STL。但這種支持並不總是充分和成功。尤其是微軟將STL看成一種負擔,而不是把它當成一種好技術來對待。這顯然是非常不明智的。

另一方面,公正地講,STL確實很神秘,表現在其內容劃分、發生器以及容器等方面。並且它的模板代碼總是讓人不可接近(有點像ATL),閱讀STL代碼對所有人都是個嚴重的挑戰。但Unix程序員可能體會到了STL所包含的東西,如果你熟悉了STL的那些單調乏味的術語,意想不到的函數名以及高度概括的代碼,如果你能駕馭它們,那種感覺好極了。不久你就會融入到其中並發現STL的功能是多麼強大,並且易於使用。STL遵循Unix的系統慣例,象SED,AWK和Emacs——難於學習,但功能強大並易於使用(我坦白承認打死都不會用Emacs)。如果你真想做一些低級編程,那就認識STL吧!哪裡能找到更多的有關STL的內容呢?網絡上有很多關於STL的站點。只要用“Standard Template Library”或“STL”來搜索就可以找到一大把。最有名的一個站點是:

http://www.sgi.com/Technology/STL/index.html

你可以從上面找到容易理解文檔和FAQ頁面。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved