MFC提供CList 类;
类CList支持可按顺序或按值访问的非唯一对象的有序列表;CList 列表与双链接列表行为相似;
类型POSITION的变量是列表的关键字;可使用POSITION变量作为循环因子来顺序遍历列表,作为书签来保存位置;
CList 类的头文件是 <afxtempl.h>;
CList类的成员
构造函数
构造一个空的有序列表
GetHead 返回列表的标题元素(不能为空)
GetTail 返回列表的末尾元素(不能为空)
RemoveHead 从列表标题中移走元素
RemoveTail 从列表末尾移走元素
AddHead 添加一个元素(或另一个列表的所有元素)到列表标题(生成新的标题)
AddTail 添加一个元素(或另一个列表的所有元素)到列表尾部(生成新的尾部)
RemoveAll 从列表中移走所有元素
GetHeadPosition 返回列表标题元素的位置
GetTailPosition 返回列表尾部元素的位置
GetNext 获取用于遍历下一个元素
GetPrev 获取用于遍历的前一个元素
GetAt 在指定位置上获得元素
SetAt 在指定位置上设置元素
RemoveAt 从列表中删除一个由位置确定的元素
InsertBefore 在指定位置前插入一个新的元素
InsertAfter 在指定位置后插入一个新的元素
Find 获得由指针值确定的元素位置
FindIndex 获得由基于零的索引指定的元素位置
GetCount 返回此列表中的元素数
IsEmpty 检测空列表的情况(没有元素)
下面看一下存储CString对象和CPoint对象的遍历;
void CCltestView::OnDraw(CDC* pDC)
{CCltestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCList<CString ,CString&> list;int i=0;CString str1="hello"; CString str2="world"; CString str3="AAA"; CString str4="BBB"; list.AddTail(str1); list.AddTail(str2); list.AddTail(str3); list.AddTail(str4); POSITION pos = list.GetHeadPosition(); while(pos!=NULL){ pDC->TextOut(100,100+i*30,list.GetNext(pos));i = i+1;}CString mystr;CPoint mypt;CList <CPoint , CPoint &> listPoint;for (int Index = 0; Index < 10; Index++){CPoint pt(Index , Index);listPoint.AddTail(pt);}i=0;POSITION pi = listPoint.GetHeadPosition();while(pi!=NULL){mypt = listPoint.GetNext(pi);mystr.Format("%d, %d", mypt.x, mypt.y);pDC->TextOut(250,50+i*30,mystr);i=i+1;}
}
运行如下;