集合类帮助器

集合类 CMapCListCArray 使用模板化的全局帮助程序函数来比较、复制和序列化元素。 作为基于 CMapCListCArray 的类实现的一部分,必须根据需要使用根据映射、列表或数组中存储的数据类型定制的版本来重写这些函数。 有关重写 SerializeElements 等帮助程序函数的信息,请参阅文章集合:如何生成类型安全的集合。 请注意,ConstructElementsDestructElements 已弃用。

Microsoft 基础类库在 afxtempl.h 中提供了以下全局函数来帮助自定义集合类:

集合类帮助器

名称 描述
CompareElements 指示元素是否相同。
CopyElements 将元素从一个数组复制到另一个数组。
DumpElements 提供面向流的诊断输出。
HashKey 计算哈希键。
SerializeElements 在存档中存储或检索元素。

CompareElements

CList::Find 直接调用,并且由 CMap::LookupCMap::operator[] 间接调用。

template<class TYPE, class ARG_TYPE>
BOOL AFXAPI
CompareElements(
    const TYPE* pElement1,
    const ARG_TYPE* pElement2);

参数

TYPE
要比较的第一个元素的类型。

pElement1
指向要比较的第一个元素的指针。

ARG_TYPE
要比较的第二个元素的类型。

pElement2
指向要比较的第二个元素的指针。

返回值

如果 pElement1 指向的对象等于 pElement2 指向的对象,则为非零;否则为 0

备注

CMap 调用使用 CMap 模板参数 KEY 和 ARG_KEY

默认实现返回 *pElement1 和 *pElement2 的比较结果。 重写此函数,以便它以适合应用程序的方式比较元素。

C++ 语言为简单类型(charintfloat 等)定义了比较运算符 (==),但未为类和结构定义比较运算符。 如果想要使用 CompareElements 或实例化使用它的集合类之一,则必须定义比较运算符或使用返回适当值的版本重载 CompareElements

要求

标头: afxtempl.h

CopyElements

此函数将由 CArray::AppendCArray::Copy 直接调用。

template<class TYPE>
void AFXAPI CopyElements(
    TYPE* pDest,
    const TYPE* pSrc,
    INT_PTR nCount);

参数

TYPE
指定要复制的元素类型的模板参数。

pDest
指向将复制元素的目标位置。

pSrc
指向要复制的元素的源。

nCount
要复制的元素的数量。

注解

默认实现使用简单的赋值运算符 ( = ) 执行复制操作。 如果复制类型没有重载操作符 =,则默认实现将执行按位复制。

有关实现此函数及其他帮助程序函数的信息,请参阅文章集合:如何生成类型安全的集合

要求

标头:afxtempl.h

DumpElements

重写时,为集合的元素提供面向流的诊断输出(采用文本形式)。

template<class TYPE>
void  AFXAPI DumpElements(
    CDumpContext& dc,
    const TYPE* pElements,
    INT_PTR nCount);

参数

dc
用于转储元素的转储上下文。

TYPE
指定元素类型的模板参数。

pElements
指向要转储的元素的指针。

nCount
要转储的元素的数量。

备注

如果转储深度大于 0,则 CArray::DumpCList::DumpCMap::Dump 函数将调用此函数。

默认实现不执行任何操作。 如果集合的元素派生自 CObject,则重写通常会循环访问集合的元素,依次为每个元素调用 Dump

要求

标头:afxtempl.h

HashKey

计算给定键的哈希值。

template<class ARG_KEY>
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY  key);

参数

ARG_KEY
指定用于访问映射键的数据类型的模板参数。


要计算其哈希值的键。

返回值

键的哈希值。

备注

此函数由 CMap::RemoveKey 直接调用,并且由 CMap::LookupCMap::operator[] 间接调用。

默认实现通过将键向右移动四个位置来创建哈希值。 重写此函数,以便其返回适合应用程序的哈希值。

示例

template <> UINT AFXAPI HashKey(unsigned __int64 key)
{
   // Generate the hash value by XORing the lower 32 bits of the number
   // with the upper 32 bits
   return(UINT(key) ^ UINT(key >> 32));
}

要求

标头:afxtempl.h

SerializeElements

CArrayCListCMap 调用此函数以序列化元素。

template<class TYPE>
void AFXAPI SerializeElements(CArchive& ar, TYPE* pElements, INT_PTR nCount);

参数

TYPE
指定元素类型的模板参数。

ar
要存档到或从中存档的存档对象。

pElements
指向要存档的元素的指针。

nCount
要存档的元素数

备注

默认实现执行按位读取或写入。

有关实现此函数及其他帮助程序函数的信息,请参阅文章集合:如何生成类型安全的集合

示例

请参阅文章集合:如何生成类型安全的集合中的示例。

要求

标头:afxtempl.h

另请参阅

宏和全局函数
CMap 类
CList 类
CArray 类