MSDN:基于模板的集合类

Win 专栏收录该内容
84 篇文章 0 订阅

翻译:Collections:Template-Based Classes

    这篇文章是介绍在MFC3.0及以后版本中的类型安全的、基于模板的集合类。使用这些模板去创建类型安全的集合与使用没有基于模板的集合类相比更加方便而且提供了更好的类型安全。

 

 MFC 预先定义了两类基于模板的集合

                *简单的数组、列表、映射类

                          CArray, CList, CMap

                *指定类型的数组、列表、映射指针

                          CTypedPtrArray, CTypedPtrList,CTypedPtrMap;

    简单的集合类都是从CObject派生下来的,因此它们继承了CObjec的序列化、动态生成等属性;类型指针集合类要求用户指定继承的基类——必须是一个MFC预先指定的非模板集合类,例如CPtrList、CPtrArray或CObList等。用户的新类型集合类继承自指定的基类型,而且新类型的函数使用封装在基类型中的方法来确保类型安全。

    要获取更多关于c++模板的信息,可以参看Template Topics主题

 

*简单Array、List、Map模板的使用

    使用简单集合模板,用户必须知道这些集合中能存什么样的数据,以及在声明自己的集合时要指定什么参数。

 

        **简单Array和List的使用

        简单数组、列表类:CArray和CList,带有两个参数:TYPE和ARG_TYPE;

    集合类中存储的数据类型是由TYPE指定的,可以是C++内置类型、c++结构体或者类、用户自定义类型;

为了更加便利和高效,可以使用ARG_TYPE参数来指定函数参数的类型,通常,指定ARG_TYPE为通过TYPE指定的类型的引用类型。例如:

        CArray<int, int> myArray;

        CList<CPerson, CPerson&> myList;

    第一个例子声明了一个数组集合类对象,myArray,其中包含int型数据;第二个例子声明一个列表集合类对象myList,其中存放CPerson对象;集合类的有些成员函数的参数是由ARG_TYPE模板参数指定的,例如CArray的Add成员函数带有一个ARG_TYPE参数:

        CArray<CPreson, CPerson&> myArray;

        CPerson person;

        myArray->Add( person );

 

        **简单map的使用

    简单map类:CMap,携带四个参数:KEY,ARG_KEY, VALUE,和ARG_VALUE。类似于数组和列表类,map类能够存储任意类型数据。不像数组和列表通过顺序索引它存储的数据,map是通过关联键和值的;是通过值所关联的键来使用存储在map中的值。参数KEY指定指定键的数据类型,如果KEY的类型是一个结构体或者类,那么ARG_KEY参数通常是KEY的引用类型。参数VALUE指定存储在map中的数据的类型,如果VALUE类型是一个结构体或者类时,ARG_VALUE参数通常是VALUE类型的引用。例如:

        CMap<int, int, MY_STRUCT, MY_STRUCT& > myMap1;

        CMap<CString, LPCSTR, CPerson, CPerson& > myMap2;

    第一个例子存储MY_STRUCT值,通过int型的键访问,而且通过引用类型返回访问的MY_STRUCT数据项。第二个例子存储CPerson值,使用CString键访问,并且返回访问对象的引用,这个例子可以实现一个地址本。

由于参数KEY是一个CString类型,KEY_TYPE参数是一个LPCSTR类型,存储在map中的键类型是CString类型,但是在像SetAt这些函数中引用是通过LPCSTR类型指针的,例如:

        CMap< CString, LPCSTR, CPerson, CPerson& > myMap2;

        CPerson person;

        LPCSTR lpstrName = “Jones”;

        myMap2->SetAt( lpstrName, person);

 

*指定类型指针集合模板的使用

    使用指定类型的指针集合模板,要知道这些集合中存放什么样的数据,声明自己的集合时使用什么样的参数。

        **指定类型指针的数组和列表的使用

    指定类型指针的数组和列表类:CTypedPtrArray和CTypedPtrList,携带两个参数:BASE_CLASS 和TYPE。这些类可以存储通过参数TYPE指定的任意类型数据。它们是从一个非模板集合类(存储指针)继承下来,通过BASE_CLASS参数指定基类型,对数组来说,使用CObArray或者CPtrArray,对于列表来说,使用CObList或者CPtrList。

    事实上,比如声明一个基于CObList的集合,新类不仅继承了基类的成员,而且声明了一些额外的类型安全的函数和操作符,它们的类型安全通过封装调用基类的成员来提供;那么这些封装管理所有必要的类型转换。

例如:

        CTypedPtrArray<CObArray, CPerson*> myArray;

        CTypedPtrArray<CPtrList, MY_STRUCT*> myList;

    第一个例子声明一个指定类型的指针数组,myArray,继承自CObArray,数组存储和返回指向CPerson(CPerson继承自CObject)对象的指针,用户可以调用任何CObArray的成员函数,也可以调用新的类型安全的GetAt和ElementAt函数或者使用类型安全的[]操作符。

    第二个例子声明了一个指定类型的指针列表,myList,继承自CPtrList,列表中存储MY_STRUCT类型指针,存储不是从CObject继承下来的类的指针,要指定基类型为CPtrList,CTypedPtrList有许多类型安全的成员函数:GetHead、GetTail、RemoveHead、RemoveTail、GetNext、GetPrev、GetAt。

        **指定类型的map的使用

        CTypedPtrMap,携带三个参数:BASE_CLASS, KEY,VALUE;

    参数BASE_CLASS指定新类的基类:可以是CMapPrtToWord、CMapPtrToPtr、CMapStringToPtr、CMapWordToPtr、CMapStringToOb等,参数KEY类似CMap中的KEY,它指定查询的键值。参数VALUE指定存储在map中的对象的类型。例如:

        CTypedPtrMap<CMapPtrToPtr,  CString, MY_STRUCT*> myPtrMap;

        CTypedPtrMap<CMapStringToOb,CString, CMyObject*> myObjectMap;

    第一个例子是一个基于CMapPtrToPtr的map,它使用CString Key映射MY_STRUCT指针,可以调用类型安全的查询函数来查询存储的指针,也可以使用[]操作符来查询和没查到时添加,可以使用类型安全的GetNextAssoc函数来指向下一位置,也可以使用CMapPtrToPtr的其他成员函数。

    第二个例子是一个基于CMapStringToOb的map,它使用CString Key映射到CMyObject对象指针,可以像上面介绍一样使用类型安全的成员函数,也可以调用CMapStringToOb类的成员函数。

 

注意:如果你为VALUE参数指定一个类类型或结构体类型,而不是该类型的指针或者引用,那么这个类或者结构体必须要有一个拷贝构造函数。

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值