`
yesjavame
  • 浏览: 697014 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

关于MFC和STL的使用

阅读更多
关于MFC和STL的使用
赵湘宁
问题:
我在几个不同的地方读过有关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<string>和<list>,然后为方便起见,添加一个类型定义:
// 串列表
typedef list<string> 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页面。

最后祝你编程愉快!
分享到:
评论

相关推荐

    MFC+OpenGL 读取并显示STL三维模型_c ++ 三维图形数据stl,c++ opengl stl3d显示

    在本文中,我们将深入探讨如何使用MFC(Microsoft Foundation Classes)和OpenGL库来读取并显示STL(Stereo Lithography)格式的三维模型。STL是一种广泛用于3D打印和计算机辅助设计(CAD)的文件格式,它包含了物体...

    mfc STL格式形体的读取与显示

    在MFC(Microsoft Foundation Classes)框架中处理STL文件,可以实现对3D模型的读取和显示,为用户提供交互式的观察体验。 在"MFC STL格式形体的读取与显示"中,我们需要理解以下几个关键知识点: 1. STL文件结构...

    MFC+OpenGL 读取并显示STL三维模型

    在本文中,我们将深入探讨如何使用MFC(Microsoft Foundation Classes)和OpenGL库来读取并显示STL(Stereo Lithography)格式的三维模型。STL是一种广泛用于3D打印和计算机辅助设计(CAD)的文件格式,它描述了物体...

    MFC+OpenGL实现STL文件的读取与显示--更新博主Belence_Zhao的代码/添加了多stl文件合并的python代码

    MFC+OpenGL三维绘图(二)——打开一个...要显示其他stl文件 只需要修改OpenGLDrawingView.cpp文件 125行和129行的stl文件路径 .stl和.txt都可以读取 多个stl文件拼接的python代码 为OpenGLDrawing文件夹中的test.py

    ZipArchive windows版库以及MFC和STL示例

    资源中包含了使用MFC的示例代码和使用STL的示例代码 Zippe(使用STL的示例代码)只能在release STL配置下编译通过 本压缩包是ZipArchive的GPL版本,通过研究这些代码对熟悉压缩算法,MFC和STL都有一定的帮助。

    MFC自带的stl正则表达式的使用

    MFC 自带的STL正则表达式功能与标准的正则表达式库有些许差异,因此在使用时需要特别注意。 本文将详细介绍如何在MFC中利用STL进行正则表达式操作,并探讨与主流正则表达式规则的不同之处。 首先,MFC中的正则...

    Software Application Development - A Visual C++ MFC and STL Tutorial

    Software Application Development: A Visual C++, MFC, and STL Tutorial (Chapman & Hall/CRC Computer and Information Science Series) 1st Edition 2012年出版的MFC书 无水印pdf 0分 Paperback: 1216 pages ...

    SAGA STL和MFC

    SAGA可能使用了STL和MFC的一些特性,比如利用STL的容器和算法进行数据处理,或者在Windows环境下使用MFC进行图形界面的开发。 学习STL和MFC可以帮助C++开发者提高效率,减少错误,并且能够编写出更加稳定、可维护的...

    STLViewer读取并显示stl文件

    本文将深入探讨如何使用MFC(Microsoft Foundation Classes)程序通过OpenGL库来读取并显示STL文件,以及在不同开发环境中,如VC6和VS2008中的实现差异。 首先,MFC是微软提供的一个C++类库,用于构建Windows应用...

    MiniDraw.rar_mfc stl_minidraw

    这款应用程序的开发基于Microsoft Foundation Classes (MFC)库,并充分利用了Standard Template Library (STL)中的vector容器,旨在帮助学习者更好地理解和运用这两种重要的编程工具。 首先,我们来深入探讨一下MFC...

    VC_CIVStringSet.rar_VC_CIVStringS_mfc stl_字符串类

    MFC(Microsoft Foundation Classes)和STL(Standard Template Library)是两个广泛使用的库,它们提供了强大的工具来处理字符串。"VC_CIVStringSet.rar"这个压缩包显然包含了一个自定义的字符串类"VC_CIVStringS...

    mfc,c++,stl的中文帮助

    MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于简化Windows应用程序开发。它封装了Windows API,使得开发者可以...在实际项目中,MFC、C++和STL的结合使用能让你编写出高效、健壮的Windows应用程序。

    MFC序列化到xml文档,支持STL的vector,map,pair

    在描述中提到的“MFC序列化到xml文档,支持STL的vector,map,pair”是一个扩展,使得MFC能够处理标准模板库(STL)中的容器,如vector、map和pair,将它们序列化到XML文档中。 XML(eXtensible Markup Language)...

    c++开发各种API文档 STL windows API MFC

    总之,C++开发中涉及的API文档、STL、Windows API和MFC都是开发者必备的知识点,它们共同构成了C++丰富的生态系统,为解决各种问题提供了强大的工具。深入理解并熟练运用这些工具,能够提升我们的编程效率,创作出高...

    XYZ和STL文件MFC显示示例

    VS13 MFC工程代码, 示例如何使用glfw通过opengl显示xyz文件以及stl文件. 代码中使用到的glfw是进过稍微修改过后的, 可以直接支持将创建的窗口集成到MFC控件中. 代码结构清晰, 使用示例简单. 详情可以查看博客: ...

    包含stl算法的应用程序

    在学习过程中,你可以通过压缩包内的应用程序了解STL和MFC如何协同工作,通过查看源代码来深入理解每种容器和算法的使用场景。记住,复制代码到编译器之前,确保你的环境已包含必要的库支持,如STL和MFC库。然后,...

    VC++2012 MFC实现调用TetGen对stl模型数据进行四面体剖分

    本文旨在详细介绍如何利用 VC++2012 和 MFC (Microsoft Foundation Classes) 调用 TetGen 来对 STL (Standard Triangle Language) 文件进行四面体剖分。四面体剖分是一种三维几何处理技术,广泛应用于有限元分析、...

    STL-MOUSEMOVE.rar_STL opengl_STL文件_VC 界面_stl vc_鼠标 旋转

    2. OpenGL编程:设置OpenGL环境,使用OpenGL绘制STL模型,应用视图和模型变换。 3. VC++界面开发:利用MFC或类似库创建用户界面,处理鼠标事件。 4. 鼠标交互:实现鼠标旋转模型的功能,通过更新视角矩阵实现3D旋转...

    Visual C++ MFC实例教程+Effective STL 中文版+Effective C++

    《Visual C++ MFC实例教程》通过丰富的实例来展示如何使用MFC的各种组件和功能,让读者能够快速理解和掌握MFC编程的核心概念,比如窗口创建、消息处理、控件与对话框的使用等。对于希望从事Windows平台软件开发的C++...

    How to wrap an MFC collection into an STL compliant iterator

    现在,你可以使用MfcCollectionWrapper和MfcIterator像操作STL容器一样操作MFC集合了。例如: ```cpp MfcCollectionWrapper wrapper(someMfcCollection); for (auto it = wrapper.begin(); it != wrapper.end(); ++...

Global site tag (gtag.js) - Google Analytics