|
可串行化排序动态对象数组的VC实现
VC6.0里面的CObArray以及基于它的模板数组都支持串行化Serialize,但是遗憾的是不支持排序,本文给出一个可排序并也支持对象串行化的动态对象数组类CSorObtArray。
排序采用qsort快速排序,用一个对象CSortObject作为基类,凡是从CSortObject派生而来的类都可加入CSortObArray对象,重载CSortObject::Compare()可实现对象的快速排序,重载CSortObject::Serialize()可实现对象的串行化。CSortObject和CSortObArray的关系如同VC中CObject和CObArray的关系。
1、SortObArray.h
// SortObArray.h 带排序的对象
//
#pragma once
class CSortObject : public CObject //排序对象基类
{
protected:
DECLARE_SERIAL(CSortObject);
public:
CSortObject();
virtual ~CSortObject();
virtual void Serialize(CArchive& ar);
void SetSortAsc(BOOL bAsc);//设置排序方式
virtual int Compare(CSortObject *pOb);//排序比较,bASC是升序
protected:
BOOL m_bAsc;//升序
};
typedef CSortObject *LPSORTOB;//类型定义
class CSortObArray : public CObject//排序对象动态数组
{
protected:
DECLARE_SERIAL(CSortObArray);
public:
CSortObArray();
~CSortObArray();//析构只删除空间,不删除对象
virtual void Serialize(CArchive& ar);//串行化,已有的对象会被删除掉
public:
BOOL Add(LPSORTOB pOb);//添加
int GetSize();//取当前对象个数
LPSORTOB GetAt(int nIndex);//取一个对象
void RemoveAll();//清除空间并重新初始化 ,不删除对象
LPSORTOB RemoveAt(int nIndex);//移除对象,不删除初对象,返回被移除的对象
void DeleteObjects();//删除所有对象
void Qsort(BOOL bAsc);//快速排序
protected:
LPSORTOB *m_ob;//对象数组
int m_nMaxSize;
int m_nSize;
int m_nGrown;//每次增量
static int Comp(const void *p1,const void *p2 );
BOOL Grown();//增长
};
class CSortTestOb : public CSortObject//排序测试对象
{
protected:
DECLARE_SERIAL(CSortTestOb);
public:
CSortTestOb();
CSortTestOb(int ndata);
int m_ndata;
virtual ~CSortTestOb();
virtual void Serialize(CArchive& ar);
virtual int Compare(CSortObject *pOb);//排序比较,bASC是升序
};
2、SortObArray.cpp
3、测试代码
void test()
{
//测试排序对象
CSortObArray sao;
int i;
CSortTestOb *pob;
for(i=0;i<100;i++)
{
pob = new CSortTestOb(i);//升序加入
sao.Add(pob);
}
sao.Qsort(FALSE);//降序排序
//串行化测试
CMemFile file;
CArchive ar(&file, CArchive::store);//存入
sao.Serialize(ar);
ar.Close();
file.SeekToBegin();
CArchive arr(&file, CArchive::load);//读出
sao.Serialize(arr);
arr.Close();
//查看结果
for(i=0;i<sao.GetSize();i++)
{
TRACE("%d\n",((CSortTestOb *)(sao.GetAt(i)))->m_ndata);
}
sao.DeleteObjects();//删除对象
}
2008.10.12 蒋勇 www.kipway.com
|