本文提供详细信息,以帮助您选择适于特定应用程序需要的集合类。
集合类的选择取决于许多因素,包括:
- 类形状的特性:排序、索引和性能,如本主题稍后介绍的集合形状特性表所示
- 类是否使用 C++ 模板
- 存储在集合中的元素是否可以序列化
- 存储在集合中的元素是否可以转储以用于诊断
- 集合是否是类型安全的
下表集合形状特性总结了可用集合形状的特性。
- 第 2 列和第 3 列描述了每个形状的排序和访问特性。在表中,术语“已排序”表示按插入或删除项的顺序确定项在集合中的顺序,而不是指项按其内容排序。术语“已索引”表示集合中的项可以通过整数索引检索,这和典型数组中的项很相似。
- 第 4 列和第 5 列描述了每个形状的性能。在需要对集合执行多次插入操作的应用程序中,插入速度可能特别重要;而对于其他应用程序,查找速度可能更重要。
- 第 6 列描述了每个形状是否允许重复元素。
形状 | 已排序? | 已索引? | 插入元素 | 搜索指定元素 | 重复元素? |
---|---|---|---|---|---|
列表 | 是 | 否 | 快 | 慢 | 是 |
数组 | 是 | 按整数 | 慢 | 慢 | 是 |
映射 | 否 | 按键 | 快 | 快 | 否(键) 是(值) |
下表 MFC 集合类的特性总结了特定 MFC 集合类的其他重要特性,可以作为选择原则。您的选择可能取决于特定的因素,如类是否基于 C++ 模板,它的元素是否可以通过 MFC 的文档序列化机制序列化,它的元素是否可以通过 MFC 诊断转储机制转储,类是否是类型安全的,即是否可以保证存储在基于类的集合中和从该集合中检索的元素类型。
类 | 使用 C++ 模板 | 可以 序列化 | 可以 转储 | 类型安全 |
---|---|---|---|---|
CArray | 是 | 是1 | 是1 | 否 |
CByteArray | 否 | 是 | 是 | 是3 |
CDWordArray | 否 | 是 | 是 | 是3 |
CList | 是 | 是1 | 是1 | 否 |
CMap | 是 | 是1 | 是1 | 否 |
CMapPtrToPtr | 否 | 否 | 是 | 否 |
CMapPtrToWord | 否 | 否 | 是 | 否 |
CMapStringToOb | 否 | 是 | 是 | 否 |
CMapStringToPtr | 否 | 否 | 是 | 否 |
CMapStringToString | 否 | 是 | 是 | 是3 |
CMapWordToOb | 否 | 是 | 是 | 否 |
CMapWordToPtr | 否 | 否 | 是 | 否 |
CObArray | 否 | 是 | 是 | 否 |
CObList | 否 | 是 | 是 | 否 |
CPtrArray | 否 | 否 | 是 | 否 |
CPtrList | 否 | 否 | 是 | 否 |
CStringArray | 否 | 是 | 是 | 是3 |
CStringList | 否 | 是 | 是 | 是3 |
CTypedPtrArray | 是 | 取决于类型2 | 是 | 是 |
CTypedPtrList | 是 | 取决于类型2 | 是 | 是 |
CTypedPtrMap | 是 | 取决于类型2 | 是 | 是 |
CUIntArray | 否 | 否 | 是 | 是3 |
CWordArray | 否 | 是 | 是 | 是3 |
1. 若要序列化,必须显式调用集合对象的 Serialize 函数;若要转储,必须显式调用集合对象的 Dump 函数。不能用 ar << collObj
的形式进行序列化,或用 dmp
<< collObj
的形式进行转储。
2. 可序列化性取决于基础集合类型。例如,如果类型指针数组基于 CObArray,则它可序列化;如果基于 CPtrArray,则它不可序列化。通常情况下,“Ptr”类无法序列化。
3. 如果该列中的标记为“是”,则只要按本来用途使用非模板集合类,它就是类型安全的。例如,如果将字节存储在 CByteArray 中,则该数组是类型安全的。但如果用该数组存储字符,则它的类型安全不太可靠。
请参见
集合 | 基于模板的类 | 如何创建类型安全集合 | 访问集合的所有成员