问题:
我在几个不同的地方读过有关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页面。