转自:http://blog.sina.com.cn/s/blog_5cda82f40100aw58.html
一、类的概要和头文件
1. CList类:产生不定类型的列表,是一个集合类,也是一个双向链表类,是一个类模板。
2. #include "Afxtempl.h" //包含头文件
3. CList的构造函数,举例如下:
CList<CString ,CString&> list; //链表对象1
CList<CString,CString> 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<CString ,CString&> 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的数据保存到文件,并能读取了。