之前,我使用MFC集合类,例如CArray
和CMap
。一段时间后,我切换到STL容器并使用它们一段时间了。尽管我发现STL要好得多,但我无法准确指出原因。如下是其中一些推理:
- 需要 MFC:不适用,因为我的程序的其他部分使用MFC。
- 平台相关:不适用,因为我只在Windows上运行应用程序(不需要可移植性)。
- 已在C++标准中定义:可以,但MFC容器仍然可用。
我唯一能想到的原因就是我可以在容器上使用算法。这里是否有我错过的其他原因 - 是什么使STL容器比MFC容器更好?
之前,我使用MFC集合类,例如CArray
和CMap
。一段时间后,我切换到STL容器并使用它们一段时间了。尽管我发现STL要好得多,但我无法准确指出原因。如下是其中一些推理:
我唯一能想到的原因就是我可以在容器上使用算法。这里是否有我错过的其他原因 - 是什么使STL容器比MFC容器更好?
Ronald Laeremans,VC++产品单位经理,甚至在2006年6月建议使用STL:
事实上,团队会给你同样的答案。MFC集合类仅用于向后兼容。C ++有一个标准的集合类,那就是标准C ++库。在MFC应用程序中使用任何标准库都没有技术缺陷。
我们不打算在这个领域进行重大改变。
Ronald Laeremans
代理产品单位经理
Visual C ++团队
然而,在我工作期间需要在Windows安装阶段运行的某些代码时,我被告知不能使用STL容器,而是要使用ATL容器(特别是CString
,我想它并不是真正的容器)。解释是STL容器对运行时位有依赖,而这些依赖可能在代码执行时实际上并不可用,而ATL集合不存在这些问题。这是一个相当特殊的场景,不应影响99%的现有代码。
CString
并不是一个真正的容器(除非在很技术性的意义上),它有很多便利功能,使得在处理大量 Win32 和 COM API 时更加适用。 - Pavel Minaevstd::allocator<X>::allocate
的实现细节、异常类以及其他相关内容。 - Mooing DuckSTL 容器:
当然,使用STL以外的东西也并不是 inherently wrong (本质上错误的)。
MFC的一个好处是仍然存在大量的MFC代码。其他答案谈到了第三方兼容性。不要忘记基于第三方MFC的东西。
MFC容器继承自CObject
,而CObject
的赋值运算符是私有的。在实践中,我发现这非常令人恼火。
std::vector
与CArray不同,保证其内存块是连续的,因此您可以轻松地与C编程接口进行交互:
std::vector<char> buffer;
char* c_buffer = &*buffer.begin();
事实上,您也可以在一些MFC容器上使用STL算法。然而,由于许多第三方库(如Boost、arabica、Crypto++、utf-cpp等)是为STL设计的,不了解MFC容器,因此STL容器更受欢迎,这是另一个非常实用的原因。
现在假设C++开发者至少对STL有些了解。但是对于MFC容器并非如此。因此,如果您要向团队中添加新的开发人员,那么找到一个熟悉STL而不是MFC容器的人将更容易,因此他们可以立即为项目做出贡献。
我认为问题归结为一个简单的问题:你更信任谁?如果你信任微软,那么继续使用MFC变体。如果你信任行业,那么使用STL。
我支持STL,因为今天在Windows上运行的代码明天可能需要移植到另一个平台。 :)