查找(CFind)是一个概念,作用于特定的数据(CData),因为数据有各种不同的特性,有排序了的(CDataSorted),和没有排序过的(CDataChaos),对于不同特性的数据,应该应用不同的查找方法, 对于排序过的数据(CDataSorted),应该使用一种查找方法(CFindBinarySearch), 对于没有排序过的数据(CDataChaos),应该使用另一种查找方法(CFindWorker), 呵呵,所以产生了如下的类图:
+----------+ +-------+
+ CFind +<>-------------------------->+ CData +
+-+------+-+ +---+---+
^ ^ ^
^ ^ +--------+------+
^ ^ ^ ^
+-----------+-+ +-+-----------------+ +-----+-------+ +---+--------+
+ CFindWorker + + CFindBinarySearch + + CDataSorted + + CDataChaos +
+-------------+ +-------------------+ +-------------+ +------------+
这样的话,用户就可以通过派生CData类来加入新的存储格式的数据,通过派生CFind类来加入新的查找方法了, 不过,一般来说,查找方法都是和数据存储方式紧密耦合的,所以,嘿嘿嘿,..., 请注意我的目的呀,我只是为了练习C++才这样写的,哈哈:) 我想一定会有很多人大骂我白痴的吧,哈哈哈哈~~哈哈哈哈,就当耳旁风,不听。:)
VCkbase.com/document/image/paragraph.gif" width=14> 数据的基类:(每个类的实现请在本文提供的源代码中查找)
class CData
{
public:
CData();
CData(int iNum, int iMax); // generate the data : _v
virtual ~CData(){};
CData(const CData& rhs);
void get_data(vector& v);
protected:
vector _v;
private:
CData& operator=(const CData& rhs);
const int _iMin;
};class CDataSorted : public CData
{
public:
CDataSorted(CData rhs);
virtual ~CDataSorted(){};
private:
CDataSorted();
CDataSorted& operator=(const CDataSorted& rhs);
};
class CDataChaos : public CData
{
public:
CDataChaos(CData rhs);
virtual ~CDataChaos(){};
private:
CDataChaos();
CDataChaos& operator=(const CDataChaos& rhs);
};class CFind
{
public:
CFind(const CData& data);
virtual ~CFind();
virtual bool to_find(int elem, int& num);
protected:
CData* _pdata;
private:
CFind& operator=(const CFind& rhs);
CFind();
};class CFindWorker : public CFind
{
public:
CFindWorker(const CData& data);
virtual ~CFindWorker(){};
virtual bool to_find(int elem, int& num);
private:
CFindWorker();
};class CFindBinarySearch : public CFind
{
public:
CFindBinarySearch(const CData& data);
virtual ~CFindBinarySearch(){};
virtual bool to_find(int elem, int& num);
private:
CFindBinarySearch(); // BINARY SEARCH
};void g_find(CFind* pFind, int elem)
{
int num = 0;
if ( pFind->to_find(elem, num) )
{
cout << "\tfound " << elem
<< " by " << num << " times."
<< endl;
}
else
{
cout << "\tNOT found " << elem
<< " by " << num << " times!"
<< endl;
}
cout << endl;
}
void g_answer(CData* pData, int elem)
{
// VC++6 IDE -- add "/GR" to settings
if ( dynamic_cast<CDataSorted*>(pData) )
{
CFindBinarySearch* pBin = new CFindBinarySearch(*pData);
g_find(pBin, elem);
delete pBin;
}
else
{
CFindWorker* pWorker = new CFindWorker(*pData);
g_find(pWorker, elem);
delete pWorker;
}
}
CData* pData = new CData(1000, 2000); CDataChaos* pDataChaos = new CDataChaos(*pData); CDataSorted* pDataSorted = new CDataSorted(*pData); cout << "/- SORTED DATA -/"; g_answer( pDataSorted, 2); cout << "/- CHAOS DATA -/"; g_answer( pDataChaos, 2); cout << "/- SORTED DATA -/"; g_answer( pDataSorted, 1000); cout << "/- CHAOS DATA -/"; g_answer( pDataChaos, 1000); delete pDataSorted; delete pDataChaos; delete pData;





