集合类帮助器
集合类 CMap
、CList
和 CArray
使用模板化的全局帮助程序函数来比较、复制和序列化元素。 作为基于 CMap
、CList
和 CArray
的类实现的一部分,必须根据需要使用根据映射、列表或数组中存储的数据类型定制的版本来重写这些函数。 有关重写 SerializeElements
等帮助程序函数的信息,请参阅文章集合:如何生成类型安全的集合。 请注意,ConstructElements
和 DestructElements
已弃用。
Microsoft 基础类库在 afxtempl.h 中提供了以下全局函数来帮助自定义集合类:
集合类帮助器
名称 | 描述 |
---|---|
CompareElements | 指示元素是否相同。 |
CopyElements | 将元素从一个数组复制到另一个数组。 |
DumpElements | 提供面向流的诊断输出。 |
HashKey | 计算哈希键。 |
SerializeElements | 在存档中存储或检索元素。 |
CompareElements
由 CList::Find
直接调用,并且由 CMap::Lookup
和 CMap::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++ 语言为简单类型(char
、int
、float
等)定义了比较运算符 (==
),但未为类和结构定义比较运算符。 如果想要使用 CompareElements
或实例化使用它的集合类之一,则必须定义比较运算符或使用返回适当值的版本重载 CompareElements
。
要求
标头: afxtempl.h
CopyElements
此函数将由 CArray::Append 和 CArray::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::Dump
、CList::Dump
和 CMap::Dump
函数将调用此函数。
默认实现不执行任何操作。 如果集合的元素派生自 CObject
,则重写通常会循环访问集合的元素,依次为每个元素调用 Dump
。
要求
标头:afxtempl.h
HashKey
计算给定键的哈希值。
template<class ARG_KEY>
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key);
参数
ARG_KEY
指定用于访问映射键的数据类型的模板参数。
键
要计算其哈希值的键。
返回值
键的哈希值。
备注
此函数由 CMap::RemoveKey
直接调用,并且由 CMap::Lookup
和 CMap::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
CArray、CList 和 CMap 调用此函数以序列化元素。
template<class TYPE>
void AFXAPI SerializeElements(CArchive& ar, TYPE* pElements, INT_PTR nCount);
参数
TYPE
指定元素类型的模板参数。
ar
要存档到或从中存档的存档对象。
pElements
指向要存档的元素的指针。
nCount
要存档的元素数
备注
默认实现执行按位读取或写入。
有关实现此函数及其他帮助程序函数的信息,请参阅文章集合:如何生成类型安全的集合。
示例
请参阅文章集合:如何生成类型安全的集合中的示例。
要求
标头:afxtempl.h