为什么STL容器比MFC容器更受欢迎?

Nav*_*een 30 c++ mfc containers stl

以前,我曾经使用MFC的集合类CArrayCMap.过了一会儿,我换了STL容器,并且已经使用了一段时间.虽然我发现STL要好得多,但我无法明确指出它的确切原因.一些推理如:

  1. 它需要MFC:不成立,因为我的程序的其他部分使用MFC
  2. 它是平台相关的:不成立,因为我只在Windows上运行我的应用程序.(不需要可移植性)
  3. 它在C++标准中定义:好的,但MFC容器仍然有效

我可以提出的唯一原因是我可以在容器上使用算法.我在这里缺少任何其他原因 - 是什么让STL容器比MFC容器更好

Mic*_*urr 46

VC++产品部经理Ronald Laeremans甚至表示将在2006年6月使用STL:

坦率地说,团队会给你相同的答案.MFC集合类仅用于向后兼容.C++有一个集合类标准,那就是Standards C++ Library.在MFC应用程序中使用任何标准库没有技术缺陷.

我们不打算在这方面做出重大改变.

Ronald Laeremans
代理产品部经理
Visual C++团队

但是,有一段时间我正在处理在Windows安装阶段运行的一些代码,我不允许使用STL容器,但被告知要使用ATL容器(实际上CString特别是,我猜这不是真的一个容器).解释是,STL容器对运行时位具有依赖性,这些位在代码必须执行时可能实际上不可用,而ATL集合不存在这些问题.这是一个相当特殊的场景,不应该影响99%的代码.

  • `CString`实际上不是一个容器(除了非常技术性的意义),它确实有很多便利功能,使它在处理Win32和COM API时更加适合使用. (9认同)
  • *"解释是STL容器对运行时位有依赖性,在代码必须执行时可能实际上不可用"*...现在我想看*那个*container*代码的一部分在STL.当然,我不确定所有那些可选的调试检查,但是对于普通版本构建,我会说所有STL集合都是纯粹的头文件,而不涉及运行时位.(快速检查C++ STDLIB MSVCP*.DLL也没有发现任何与容器相关的导出.) (4认同)

fbr*_*eto 34

STL容器:

  • 有性能保证
  • 可用于也具有性能保证的 STL算法
  • 可以被第三方C++库(如Boost)利用
  • 是标准的,并且可能比专有解决方案更长久
  • 鼓励算法和数据结构的通用编程.如果您编写符合STL的新算法和数据结构,您可以免费利用STL已经提供的内容.


Dar*_*ryl 22

  • 在语法,互操作性和范例方面与其他库(如boost)的兼容性.这是一项非常重要的好处.
  • 使用STL将开发一种更有可能在其他环境中有用的技能组合.MFC不再广泛使用; STL是.
  • 使用STL将开发一种思维模式,您可能(或可能不会)在您自己编写的代码中找到有用的思维模式.

使用STL以外的东西本身并不是错误的.


Aar*_*ark 7

  • STL比MFC有更多的集合类型
  • Visual Studio(2008+)调试器可以比MFC更好地可视化STL.(AUTOEXP.DAT魔法可以解决这个问题 - 但这很痛苦!当你搞砸它时,没有什么能比调试你的调试器......)

MFC的一个好处是,那里仍然有大量的MFC代码.其他答案谈论第三方兼容性.不要忘记第三方基于MFC的东西.

  • 是的,我只是喜欢STL的VS2008调试器.以前我使用的是VC6,转换到VS2008让我的生活变得如此简单. (2认同)
  • 我最近发布了一个autoexp.dat的补充,实现了这一点:http://thetweaker.wordpress.com/2010/01/11/visualizing-mfc-containers-in-autoexp-dat/ (2认同)

Jas*_*n B 6

我总是喜欢使用更多的标准/兼容库,因为我可能有未来的项目,我可以重用一部分代码.我不知道未来的库将使用什么库,但如果我使用标准/兼容的东西,我有更好的机会使我的代码可重用.

而且,我使用的库越多,我就越舒服,越快.如果我要花时间去学习图书馆,我想确保它能够保持不变并且与特定的平台或框架无关.

当然,我说所有这些都假设我的选择在性能,功能和易用性方面非常相似.例如,如果MFC类在这些方面有足够的改进,我会改用它们.


Nem*_*vic 5

事实上,您也可以在某些 MFC 容器上使用 STL 算法。然而,STL 容器是首选的另一个非常实际的原因:许多第三方库(Boost、arabica、Crypto++、utf-cpp...)旨在与 STL 一起使用,但对 MFC 容器一无所知。


Cri*_*dam 5

MFC 容器派生自赋值运算符CObjectCObject并将赋值运算符设为私有。我在实践中发现这很烦人。

std::vector取消链接 CArray,保证内存块是连续的,因此您可以轻松地与 C 编程接口互操作:

std::vector<char> buffer; 
char* c_buffer = &*buffer.begin();
Run Code Online (Sandbox Code Playgroud)