CTypedPtrArray CTypedPtrList

C++ 同时被 2 个专栏收录
11 篇文章 0 订阅
1 篇文章 0 订阅

CTypedPtrArray CTypedPtrList

简介

MFC 数组集合类(无论是基于模板的还是不基于模板的)都使用索引访问它们的元素。MFC 列表和映射集合类(无论是基于模板的还是不基于模板的)都使用 POSITION 类型的指针描述集合内的给定位置。若要访问这些集合的一个或多个成员,请首先初始化位置指针,然后重复将该位置传递到集合并要求集合返回下一个元素。集合不负责维护迭代进度的状态信息。此信息保留在位置指针中。但是,如果给定特定位置,则集合负责返回下一个元素。
1、 CTypedPtrArray的使用

```
CTypedPtrArray<BASE_CLASS,TYPE>
//BASE_CLASS:为 CObArray or CPtrArray
//CTypedPtrArray<CObArray, CPerson*> myArray; 
CTypedPtrArray<CPtrArray, CPerson*> myArray;
for( int i = 0; i < myArray.GetSize();i++ )
{
    CPerson* thePerson = myArray.GetAt( i );
    ...
}
```

CArray是保存对象的数组;
CTypedPtrArray是保存对象指针的数组;
此示例使用包含指向 CPerson 对象的指针的类型指针数组。数组从 CPtrArray 类(非模板预定义类之一)中派生。GetAt 返回当前索引下所对应的数组元素,这里是返回数组里第i个指向 CPerson 对象的指针。对于类型指针集合类(即数组或列表),第一个参数指定基类;第二个参数指定要存储的类型。CTypedPtrArray 类也重载 [ ] 运算符,以便可以使用自定义的数组下标语法访问数组元素。以上 for 循环主体中语句的另一种替换方法是:
CPerson* thePerson = myArray[ i ];
此运算符既在 const 版本中存在,也在非 const 版本中存在。const 版本(为 const 数组调用)只能显示在赋值语句的右侧。
2、 CTypedPtrList的使用

```
CTypedPtrList<BASE_CLASS,TYPE>
//BASE_CLASS:为 CObList or CPtrList
CTypedPtrList<CPtrList, MY_STRUCT*> myList;

```

以下是CTypePtrList常用的功能函数:
首/尾元素访问
GetHead:返回列表的头元素(不能是空的)
GetTail:返回列表的尾元素(不能是空的)

操作
RemoveHead: 从列表的头部删除元素
RemoveTail: 从列表的尾部删除元素
AddHead: 将一个元素(或另一个数组中的所有元素)添加到列表的头部(产生一个新的头部)
AddTail: 将一个元素(或另一个数组中的所有元素)添加到列表的尾部(产生一个新的尾部)
重复
GetNext: 获取用于重复的下一个元素
GetPrev: 获取用于重复的前一个元素
获取/修改
GetAt: 获取在一个给定位置处的元素
SetAt: 设置在一个给定位置处的元素
成员详细解释
1、CTypedPtrList::GetHeadPosition()
这个是用来获取链表头的方法;
返回值类型: POSITION
例1:POSITION pos=pDoc->m_CirList.GetHeadPosition();
这里的pos是用来记录链表头的位置。
2、CTypedPtrList::GetHead
TYPE& GetHead( );
TYPE GetHead( ) const;
返回值:
返回列表(不能为空)的头元素。
返回值类型:与模板类里的参数2的类型一致。
如果是通过一个指向const CTypedPtrList的指针访问此列表,则GetHead返回一个类型由模板参数TYPE指定的指针。这使此函数只能被使用在赋值语句的右边,这样就保护了列表不被修改。如果列表被直接访问,或通过一个指向CTypedPtrList的指针访问,则GetHead返回对一个类型由模板参数TYPE指定的指针的引用。这使得此函数可以使用在赋值语句的任何一边,从而允许该列表可以被修改。
参数:TYPE 指定保存在列表中的元素类型的模板参数。
说明:
此成员函数用来获取代表此列表中的头元素的指针。 在调用GetHead之前,你必须保证该列表不是空的。如果该列表是空的,则Microsoft基础类库的调试版将给出断言。可以使用IsEmpty来检验该列表是否包含元素
例2.Circle * cir = m_CirList.GetHead();
前提:m_CirList里必须得有元素。因较为简单,固不多做解释。

注:GetTail()的用法与GetHead()基本一致。
返回列表(不能为空)的尾元素。
返回值类型:与模板类里的参数2的类型一致。

3、CTypedPtrList::GetNext
TYPE& GetNext( POSITION& rPosition );
TYPE GetNext( POSITION& rPosition ) const;
返回值:
用来获取下一个链表的位置。
返回值类型:与模板类里的参数2的类型一致。
参数: TYPE 指定保存在列表中的元素类型的模板参数。
rPosition 一个对先前调用GetNext,GetHeadPosition或其他成员函数返回的POSITION值的引用。
说明:
此成员函数用来获取由rPosition标识的列表元素,然后将rPosition设置为列表中的下一个项的POSITION值。如果你是通过调用GetHeadPosition或CPtrList::Find来建立初始位置的,你就可以使用GetNext来实现一个向前的反复循环。
你必须保证你的POSITION值代表的是列表中的一个有效位置。如果位置是无效的,则Microsoft基础类库的调试版将给出断言。
如果获取的元素是列表中的最后一个,则rPosition被设置为新值NULL。
在一个反复中删除一个元素是有可能的。参见CObList::RemovAt的示例。

例3:while(pos!=NULL)
{
Circle * cir = pDoc->m_CirList.GetNext(pos);
}

例3的作用,主要是遍历整个链表,从而对链表里的元素进行操作。因GetNext()返回值类型与链表里元素的类型一致, 故在此用Circle *类型的对象cir来对该链表中的元素进行操作。
在例1中提到,pos的作用是为了记录位置。 所以,while(pos!=NULL)的pos是用来判断pos是不是为空(亦可以理解为是否该链表没有元素, 或者已遍历到了尾部。)
如果pos不为空,则进入循环体,进行GetNext(pos)方法的操作。
△注△意:Circle * cir = pDoc->m_CirList.GetNext(pos); 这个是把链表里 当前位置(也就是pos)的元素赋给cir,然后pos的值变为下一个。如while(pos!=NULL)里的pos已为链表尾部, 则该值将变为Cx000000(也就是0),则跳出该循环。如不为链表的尾部,则pos的值将变为下一个位置。

注:GetPrev()的用法与GetNext()用法一致, 区别是从头到尾和从尾到头。

4、CTypedPtrList::GetPrev
TYPE& GetPrev(POSITION& rPosition );
TYPE GetPrev( POSITION& rPosition ) const;
返回值:
如果是通过一个指向const CTypedPtrList的指针访问此列表,则GetPrev返回一个类型由模板参数TYPE指定的指针。这使此函数只能被使用在赋值语句的右边,这样就保护了列表不被修改。
如果列表被直接访问,或通过一个指向CTypedPtrList的指针访问,则GetPrev返回对一个类型由模板参数TYPE指定的指针的引用。这使得此函数可以使用在赋值语句的任何一边,从而允许该列表可以被修改。
参数: TYPE 指定保存在列表中的元素类型的模板参数。
rPosition 一个对先前调用GetPrev或其它成员函数返回的POSITION值的引用。
说明:
此成员函数用来获取由rPosition标识的列表元素,然后将rPosition设置为列表中的下一个项的POSITION值。如果你是通过调用GetTailPosition或Find来建立初始位置的,你就可以使用GetPrev来实现一个反向的反复循环。
你必须保证你的POSITION值代表的是列表中的一个有效位置。如果位置是无效的,则Microsoft基础类库的调试版将给出断言。
如果获取的元素是列表中的第一个,则rPosition被设置为新值NULL。

5、CTypedPtrList::GetTail
TYPE& GetTail( );
TYPE GetTail( ) const;
返回值:
如果是通过一个指向const CTypedPtrList的指针访问此列表,则GetTail返回一个类型由模板参数TYPE指定的指针。这使此函数只能被使用在赋值语句的右边,这样就保护了列表不被修改。如果列表被直接访问,或通过一个指向CTypedPtrList的指针访问,则GetTail返回对一个类型由模板参数TYPE指定的指针的引用。这使得此函数可以使用在赋值语句的任何一边,从而允许该列表可以被修改。
参数: TYPE 指定保存在列表中的元素类型的模板参数。
说明:
此成员函数用来获取此列表中的头元素。在调用GetTail之前,你必须保证该列表不是空的。如果列表是空的,则Microsoft基础类库的调试版将给出断言。使用IsEmpty来检验列表是否包含元素。

6、CTypedPtrList::GetAt
TYPE& GetAt( POSITION position );
TYPE GetAt( POSITION position ) const;
用来获取当前位置里面的元素。
返回值类型:与模板类里的参数2的类型一致。
返回值:
如果是通过一个指向const CTypedPtrList的指针访问此列表,则GetAt返回一个类型由模板参数TYPE指定的指针。这使此函数只能被使用在赋值语句的右边,这样就保护了列表不被修改。
如果列表被直接访问,或通过一个指向CTypedPtrList的指针访问,则GetAt返回对一个类型由模板参数TYPE指定的指针的引用。这使得此函数可以使用在赋值语句的任何一边,从而允许该列表可以被修改。
参数: TYPE 指定保存在列表中的元素类型的模板参数。
position 一个由先前调用GetHeadPosition或Find成员函数返回的POSITION值。
说明:
一个类型为POSITION的变量是此列表的一个关键字。它与索引是不一样的,你不能自己处理一个POSITION值。GetAt获取与一个给定位置关联的CObject指针。
你必须确保你的POSITION值表示的是列表中的一个有效位置。如果它是无效的,则Microsoft基础类库的调试版将给出断言。
这个内联函数调用了BASE_CLASS::GetAt。

例4:Circle * Ncir=pDoc->m_CirList.GetAt(pos);
GetAt()的作用与GetNext()的作用类似,把链表里 当前位置(也就是pos)的元素赋给Ncir,注意:此时参数pos的值不变,也就是GetAt()与GetNext()的差别。

7、CTypedPtrList::SetAt
void SetAt( POSITION pos, TYPE newElement );
参数: pos 要被设置的元素的POSITION。
TYPE 保存在基类列表中的元素类型。
newElement 要被写入列表中去的对象指针。
说明:
此成员函数调用BASE_CLASS::SetAt。
一个类型为POSITION的变量是此列表的一个关键字。它与索引是不一样的,你不能自己处理一个POSITION值。SetAt写对象指针到列表中指定位置。
你必须确保你的POSITION值表示的是列表中的一个有效位置。如果它是无效的,则Microsoft基础类库的调试版将给出断言。
更多的细节说明,参见CObList::SetAt。
CTypedPtrList::RemoveHead
TYPE RemoveHead( );
返回值:
返回先前在列表头部的指针。这个指针的类型由模板参数TYPE指定。
参数: TYPE 指定保存在列表中的元素类型的模板参数。
说明:
此成员函数从列表的头部删除元素并返回这个元素。
在调用RemoveHead之前,你必须保证该列表不是空的。如果列表是空的,则Microsoft基础类库的调试版将给出断言。使用IsEmpty来检验列表是否包含元素。

8、CTypedPtrList::GetCount
返回该列表中的元素数目
返回值类型:整形(笔者认为)

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

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

抵扣说明:

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

余额充值