实际上集合类就是数据结构中的顺序存储结构和链表存储结构。它的优点就是建立这样的存储结构简单,并且把相关的操作集中成函数,方便用户的调用。比如顺序存储用到数组,如果要在数组中的固定位置添加一项,普通的方法就是要用一个for循环,有点烦琐。而在集合类中只要用一个add函数就完成了,相对简单一点。
数据结构是软件设计中的一个重要组成部分。因此我们有必要搞清楚集合类的相关问题。
1.3种类型
集合类中有3种大的类型:
(1) Array: 数组,可以动态的改变大小,有索引值和最大下标等。
(2) List:双向链表,无索引,链表有头尾,插入元素要比数组快。
(3) Map:是一种映射,俗名“字典”,是一种关联式数组。(在此不做讨论)
2.各自特点:
类型 |
是否有序 |
插入元素速度 |
搜索元素速度 |
索引 |
Array |
有 |
慢 |
慢 |
有 |
List |
有 |
快 |
慢 |
无 |
3.MFC中的集合类
类 |
是否使用模板 |
是否支持串行化 |
是否支持倾印 |
CArray |
是 |
是 |
是 |
CTypedPtrArray |
是 |
可能 |
是 |
CByteArray |
否 |
是 |
是 |
CDWordArray |
否 |
是 |
是 |
CObArray |
否 |
是 |
是 |
CPtrArray |
否 |
否 |
是 |
CStringArray |
否 |
是 |
是 |
CWordArray |
否 |
是 |
是 |
CUIntArray |
否 |
否 |
是 |
CList |
是 |
是 |
是 |
CTypedPtrList |
是 |
可能 |
是 |
COblist |
否 |
是 |
是 |
CStringList |
否 |
是 |
是 |
4.几点说明
(1) 有些集合类是从c++模板支持的,如CArray,CList,使用时必须指出所要收集对象的类型,比如int,char,CPoint等,可以参考一下c++模板的知识。
(2)在表中有2个“可能“,因为CTypedPtrArray,CTypedPtrList这些类在使用时要指定基类,如果基类可以串行化,那么它就可以串行化。
(3)在深入浅出MFC中,作者说CUIntArray是可以串行化的,但我在做项目时证明它是不可以串行化的,希望读者注意
如一个对象类:
Void CStudent::Serialize(CArchive &ar)
{
……
m_array.Serialize(ar);//这里m_array是CUIntArray的对象
}
可是运行后发现并没有成功。因此只好采用for循环:
Void CStudent::Serialize(CArchive &ar)
{
If(ar.IsStoring( ))//存储
{
ar<<m_array.GetSize();
for(int i=0;i<m_array.GetSize();i++)
ar<<m_array.GetAt(i)
}
…..//读取略
}
评论