MFC CList使用

转自:http://blog.sina.com.cn/s/blog_5cda82f40100aw58.html


一、类的概要和头文件

1. CList类:产生不定类型的列表,是一个集合类,也是一个双向链表类,是一个类模板。

2. #include "Afxtempl.h"   //包含头文件

3. CList的构造函数,举例如下:

CList list;  //链表对象1

CList list2;   //链表对象2

        这里的第一个参数CString是实例化的类型,第二个参数是类的成员函数的参数的调用形式,通常是类型引用,当然也可以是对象,而不是引用。对于大结构,还是使用引用吧。具体原因不用再重复了吧。

二、CList迭代器

        迭代器是近年在链表使用中的一个常用技术。如果大家学过java,就会知道,在java中,会有专门的一个迭代器类,这个迭代器类用来访问Collect中的数据元素。C++中STL中也有关于迭代器的描述,可以参考具体文章。在mfc中,在CList中,定义了几个迭代器的函数。他们方便了我们去访问数据元素。迭代器函数如下:

1. 成员函数:

 

GetHeadPosition Returns the position of the head element of the list.
GetTailPosition Returns the position of the tail element of the list.
GetNext Gets the next element for iterating.
GetPrev Gets the previous element for iterating.

 

     以上4个函数都是迭代器函数,前两个返回的是POSITION,他是MFC中定义的一种专门访问Collect类的一个数据类型,用它来表示元素位置。

2. 使用迭代器进行遍历双链表。

CList list;

CString str1="hello";

CString str2="world";

CString str3="my";

CString str4="life";

list.AddTail(str1);

list.AddTail(str2);

list.AddTail(str3);

list.AddTail(str4);

POSITION pos = list.GetHeadPosition();

while(pos!=NULL)

{

        pDC->TextOut(200,200,GetNext( POSITION& rPosition ) );//假设代码是在View类中的OnDraw函数里

}

三、CList的常用函数

1. 标题/末尾访问
GetHead 返回列表的标题元素(不能为空)
GetTail 返回列表的末尾元素(不能为空)

2. 操作
RemoveHead 从列表标题中移走元素
RemoveTail 从列表末尾移走元素
AddHead 添加一个元素(或另一个列表的所有元素)到列表标题(生成新的标题)
AddTail 添加一个元素(或另一个列表的所有元素)到列表尾部(生成新的尾部)
RemoveAll 从列表中移走所有元素

3. 循环
GetHeadPosition 返回列表标题元素的位置
GetTailPosition 返回列表尾部元素的位置
GetNext 获取用于遍历下一个元素
GetPrev 获取用于遍历的前一个元素

4. 获取/修改
GetAt 在指定位置上获得元素
SetAt 在指定位置上设置元素
RemoveAt 从列表中删除一个由位置确定的元素

5. 插入
InsertBefore 在指定位置前插入一个新的元素
InsertAfter 在指定位置后插入一个新的元素

6. 查找
Find 获得由指针值确定的元素位置
FindIndex 获得由基于零的索引指定的元素位置

7. 状态
GetCount 返回此列表中的元素数
IsEmpty 检测空列表的情况(没有元素)

四、CList的序列化

CList是一个继承了CObject的类,并且已经实现了Serialize(CArchive& ar)的函数,所以,对CList进行串行序列化不需要的。如果在CList类在CDocument定义了其对象list,那么在文档的Serialize(CArchive& ar)只需作如下修改:

void CDdfDoc::Serialize(CArchive& ar)

{

if (ar.IsStoring())

{

    // TODO: add storing code here

    list.Serialize(ar);

}

else

{

    // TODO: add loading code here

list.Serialize(ar);

}

}

这样,就实现了文档的串行化,如果使用mfc生成的框架,那么我们就可以直接将这个list的数据保存到文件,并能读取了。

你可能感兴趣的:(C/C++)