关于选择集合类的建议

本文包含旨在帮助你选择满足特定应用程序需求的集合类的详细信息。

你对集合类的选择取决于许多因素,包括:

  • 类形状的特征:顺序、索引和性能,正如本主题中 Collection Shape Features(集合形状特征) 表所示。

  • 类是否使用 C++ 模板

  • 存储在集合中的元素是否可以序列化

  • 存储在集合中的元素是否可以转储以供诊断

  • 集合是否为类型安全的

下表 Collection Shape Features(集合形状特征)总结了可用集合形状的特征。

  • 列 2 和 3 描述了每个形状的排序和访问特性。 在表中,术语“决定顺序”是指插入和删除项的顺序决定其在集合中的顺序;不是指项在其内容中的排序。 术语“索引检索”是指集合中的项可通过整数索引进行检索,这与典型数组中的项很相似。

  • 列 4 和 5 描述了每个形状的性能。 在需要多次插入集合的应用程序中,插入速度可能特别重要;而对于其他应用程序,查找速度可能更为重要。

  • 列 6 描述了每个形状是否允许重复元素。

Collection Shape Features(集合形状特征)

形状 已订购 已编入索引 插入元素 搜索指定的元素 重复元素
列表​​ 快速
数组 根据 int
Map 根据键 快速 快速 否(键)是(值)

下表 Characteristics of MFC Collection Classes(MFC 集合类的特征)总结了特定 MFC 集合类的其他重要特征,可作为选择的指南。 你的选择可以取决于以下因素:类是否基于 C++ 模板,它的元素是否可通过 MFC 的文档 序列化 机制进行序列化,它的元素是否可通过 MFC 的诊断转储机制进行转储,类是否是安全类型(也就是说,你是否能保证元素的类型存储在且检索自基于类的集合上)。

Characteristics of MFC Collection Classes(MFC 集合类的特征)

使用 C++

模板
可以

已序列化
可以

转储
Is

Type-Safe — 类型安全
CArray 是 1 是 1
CByteArray No 是 3
CDWordArray 是 3
CList 是 1 是 1
CMap 是 1 是 1
CMapPtrToPtr No No No
CMapPtrToWord No No No
CMapStringToOb No No
CMapStringToPtr No No No
CMapStringToString No 是 3
CMapWordToOb No
CMapWordToPtr No No No
CObArray No No
CObList No No
CPtrArray No No No
CPtrList No No No
CStringArray No 是 3
CStringList 是 3
CTypedPtrArray 取决于 2
CTypedPtrList 取决于 2
CTypedPtrMap 取决于 2
CUIntArray No No 是 3
CWordArray 是 3
  1. 要序列化,你必须明确地调用集合对象的 Serialize 函数;要转储,你必须明确地调用其 Dump 函数。 不能使用表单 ar << collObj 来进行序列化或使用表单 dmp<< collObj 来进行转储。

  2. 可序列化性取决于基础集合类型。 例如,如果类型化指针数组基于 CObArray,则可序列化;如果基于 CPtrArray,则不可序列化。 一般情况下,“Ptr”类不能进行序列化。

  3. 如果在此列中标记为“是”,若你按要求使用它,则非模板集合类为类型安全。 例如,如果你在 CByteArray中存储字节,则数组为类型安全。 但如果你将其用于存储字符,则其类型安全性稍微不确定。

另请参阅

集合
基于模板的类
如何:创建类型安全集合
访问集合的所有成员