关于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和,然后为方便起见,添加一个类型定义:

// 串列表

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页面。

时间: 2024-10-31 11:41:48

关于MFC和STL的使用的相关文章

VC MFC专题

MFC程序如何实现给对话框添加背景图片 MFC游戏开发笔记十 游戏中的碰撞检测进阶:地图类型&障碍物 MFC游戏开发笔记九 游戏中的碰撞判定初步&怪物运动简单AI MFC游戏开发笔记八 游戏特效的实现(二):粒子系统 MFC游戏开发笔记七 游戏特效的实现(一):背景滚动 MFC游戏开发笔记六 图像双缓冲技术:实现一个流畅的动画 MFC游戏开发笔记五 定时器和简单动画 MFC游戏开发笔记四 键盘响应和鼠标响应:让人物动起来 MFC游戏开发笔记三 游戏贴图与透明特效的实现 MFC游戏开发笔记二

想成为优秀的程序员这些码德不能缺

我把这些看成是作为一个程序员的基本素质,多数是编码之外的事情: ●代码每天备份:(预防意外导致的任何损失) ●上传代码时写清楚log信息:(为维护这个模块的人着想,有可能是你自己) ●提供接口时不要把问题抛给使用接口的人,升级或者变更接口时不要删掉原来的接口:(为使用你接口的同事着想) ●变量命名要见名知意:(起码不能误导别人) ●在工程中新建一个doc文件夹将项目相关的文档放在该目录下,方便后面维护的人员理解项目和代码:(为维护这个模块的人着想,有可能是你自己) ●签署bug或者转办bug时写

一个关于C++ 6.0数据拟合的算法问题

问题描述 一个关于C++ 6.0数据拟合的算法问题 MFC通过stl函数库怎么对文件中的浮点数按照方差进行数据拟合?噪声数据的过滤怎么做,用什么算法? 解决方案 http://emuch.net/html/201205/8173323.html

学计算机的值得一看的文章,跟帖也很有水平啊

从csdn上转来的,n手货,原始作者大概是04年发表的,已经无从查找原文出处了. 希望纠结要不要读研的人,看到后有所帮助. 回复CSDN和KAOYAN诸位网友的几点看法,(为避免吵架,郑重声明,本人不是高手,只是有感而发的一点个人陋见,欢迎指正,事先感谢): 就我自己的理解,谈谈我对读研和软件学院的看法,不妥之处一笑了之即可. 如果你有实际开发工作经验,感觉自己的水平和实力进入了一个高原期,迫切需要从理论上提高,那么计算机学院是唯一选择.因为计算机学院才能让你在理论上更上一层楼.软件学院从教学计

一个MFC的问题,stl有没有求方差和倒数的数学统计函数?

问题描述 一个MFC的问题,stl有没有求方差和倒数的数学统计函数? 一个MFC的问题,stl有没有求方差和倒数的数学统计函数?stl和math的函数的使用是怎么样的? 解决方案 http://www.bianceng.cn/Programming/cplus/201411/46664.htm

MFC语言的stl中如何实现通过函数过滤非法的浮点数的输入

问题描述 MFC语言的stl中如何实现通过函数过滤非法的浮点数的输入 MFC语言的stl中如何实现通过函数过滤非法的浮点数的输入,具体的函数代码怎么调用呢? 解决方案 这个和stl没有什么关系,你可以通过遍历vector或者set,找出不符合规则的数据,并且删除.

VC6下使用STL注意:不要让内存分配失败导致您的旧版STL 应用程序崩溃

大多数 C++ 开发人员在他们的代码中都广泛使用了标准模块库 (STL).如果您是其中的一员,并且正在直接使用即装即用的 STL 和 Visual C++ 6.0,则在内存不足的条件下,您的应用程序就处于崩溃的高度危险的状况下.产生此问题的原因是,检查运算符 new 是否失败是一种非常少见的做法.更糟糕的是,当 new 确实失败时,响应不是标准的.有些语言编译器返回 NULL,而其他语言则引发异常. 另外,如果您正在 MFC 项目中使用 STL,要注意 MFC 有其自己的规则集.本文将讨论这些问

结合泛型与模板的STL.NET探索

模板 开始之前,先来看一个笑话,当问一个C++程序员怎样完成一个给定的任务时,他(她)可能会提供一打或更多的潜在解决方案列表,但又会极其详细地标出每种方案的问题之处,让你不知所措,难以选择.而Visual C++ 2005,通过C++/CLI语言联编,引入了泛型的概念,使C++程序员可进一步提高程序的开发效率.关于 .NET泛型与C++模板,尽管句法上很相似,但泛型与模板是以完全不同的方法实现的,它们之间没有任何的内置兼容性. 说到泛型与模板的差别,相信每个 .NET平台的C++程序员都会问这个

STL字符串类与UNICODE及其它

我想让用户双击程序图标时按住 Control 键,以一种特殊的方式来启动程序. 但::GetCommandLine 和__argc 均没有任何反应,用 MFC 中的 CCommandLineInfo 似乎也是如此.有没有一种方法可以解决这个问题呢? 有,非常简单.你所要做的就是调用 GetKeyState.当你正在处理的当前消息被发送时, 该函数返回虚拟键的状态.这个状态可能是弹起,按下,或者套索钉.套索钉用于大写锁定( Caps)和转换锁(Shift Lock),它们可以转换状态.对于一般的