头文件
//-------------_dir.h//
#ifndef _DIR_STRUCT_
#define _DIR_STRUCT_
#include <vector>
#include <iostream>
#include <string>
using namespace std;
const char* sep=\"\t\";
template <class T>
class DIRSTRUCT
{
DIRSTRUCT * lpParentDir;
vector<DIRSTRUCT*> SubDir;
int m_nSubDir;
vector<T> data;
friend ostream& operator<<(ostream &os,DIRSTRUCT<T> & dir); //输出函数
private:
static void DisPlay(ostream &os,DIRSTRUCT<T>* lpDir); //显示辅助函数
static void Delete(DIRSTRUCT<T> *lpDir); //删除辅助函数
static void Clone(DIRSTRUCT<T> *lp,const DIRSTRUCT<T> *lpDir); //拷贝辅助函数
public:
DIRSTRUCT<T>(DIRSTRUCT* lpParent=NULL,vector<T> t=vector<T>()); //构造函数
DIRSTRUCT(const DIRSTRUCT<T>& dir); //拷贝构造函数
DIRSTRUCT<T> &operator=(DIRSTRUCT<T>& dir); //赋值
void Copy(const DIRSTRUCT<T>* lpDir); //拷贝
~DIRSTRUCT<T>(); //析构函数
public:
void AddChild(); //添加空子目录
void AddChild(vector<T> t); //添加有数据的子目录
void AddChild(DIRSTRUCT<T> dir); //添加完整子目录(包含该子目录的子目录)
void AddValue(T t); //添加数据
int find(T t); //查找指定数据,返回索引
T& GetValue(int i); //索引数据集
int DataCount(); //数据集数目
int DirCount(); //子目录数
DIRSTRUCT<T>* GetChild(int i); //索引子目录
DIRSTRUCT<T>* operator[](int i); //索引子目录
DIRSTRUCT<T>* GetParent(); //获取父目录
bool IsChild(); //是否为子目录
bool IsChild(DIRSTRUCT<T>* lpDir); //是否为lpDir的子孙目录
void ClearValue(); //清空数据
void clear(); //清空整个结构
};
#endif //_DIR_STRUCT_
实现文件
//-------------dir.h-------------//
程序代码:
#ifndef _DIR_IMPLENT_
#define _DIR_IMPLENT_
#include \"_dir.h\"
template <class T>
ostream& operator<<(ostream &os,DIRSTRUCT<T> & dir)
{
DIRSTRUCT<T>::DisPlay(os,&dir);
return os;
}
template <class T>
void DIRSTRUCT<T>::DisPlay(ostream &os,DIRSTRUCT<T>* lpDir)
{
for(int j=0;j<lpDir->DataCount();j++)
os<<lpDir->GetValue(j)<<sep;
os<<endl;
if(!lpDir->m_nSubDir)
return;
for(int i=0;i<lpDir->m_nSubDir;i++)
{
DisPlay(os,lpDir->SubDir[i]);
}
}
template <class T>
void DIRSTRUCT<T>::Delete(DIRSTRUCT<T> *lpDir)
{
if(lpDir->m_nSubDir)
{
for(int i=lpDir->m_nSubDir-1;i>=0;i--)
{
lpDir->ClearValue();
delete lpDir->GetChild(i);
lpDir->SubDir.pop_back();
}
}
lpDir->lpParentDir=NULL;
lpDir->m_nSubDir=0;
}
template <class T>
void DIRSTRUCT<T>::Clone(DIRSTRUCT<T> *lp,const DIRSTRUCT<T> *lpDir)
{
for(int i=0;i<lpDir->m_nSubDir;i++)
{
lp->AddChild(lpDir->SubDir[i]->data);
Clone(lp->SubDir[i],lpDir->SubDir[i]);
}
}
template <class T>
DIRSTRUCT<T>::DIRSTRUCT(DIRSTRUCT* lpParent,vector<T> t) //构造函数
{
m_nSubDir=0;
lpParentDir=lpParent;
data=t;
}
template <class T>
DIRSTRUCT<T>::DIRSTRUCT(const DIRSTRUCT<T>& dir) //拷贝构造函数
{
Copy(&dir);
}
template <class T>
DIRSTRUCT<T>& DIRSTRUCT<T>::operator=(DIRSTRUCT<T>& dir) //赋值
{
if(!IsChild(&dir))
Copy(&dir);
return *this;
}
template <class T>
void DIRSTRUCT<T>::Copy(const DIRSTRUCT<T>* lpDir) //拷贝
{
clear();
data=lpDir->data;
Clone(this,lpDir);
}
template <class T>
DIRSTRUCT<T>::~DIRSTRUCT<T>() //析构函数
{
clear();
}
template <class T>
void DIRSTRUCT<T>::AddChild() //添加空子目录
{
m_nSubDir++;
DIRSTRUCT* lpDir=new DIRSTRUCT<T>();
SubDir.push_back(lpDir);
}
template <class T>
void DIRSTRUCT<T>::AddChild(vector<T> t) //添加有数据的子目录
{
m_nSubDir++;
DIRSTRUCT* lpDir=new DIRSTRUCT<T>(this,t);
SubDir.push_back(lpDir);
}
template <class T>
void DIRSTRUCT<T>::AddChild(DIRSTRUCT<T> dir) //添加完整子目录(包含该子目录的子目录)
{
m_nSubDir++;
DIRSTRUCT<T>* pSubdir=new DIRSTRUCT<T>();
*pSubdir=dir;
SubDir.push_back(pSubdir);
}
template <class T>
void DIRSTRUCT<T>::AddValue(T t) //添加数据
{
data.push_back(t);
}
template <class T>
int DIRSTRUCT<T>::find(T t) //查找指定数据,返回索引
{
for(int i=0;i<DataCount();i++)
if(GetValue(i)==t)
return i;
return -1;
}
template <class T>
T& DIRSTRUCT<T>::GetValue(int i) //索引数据集
{
return data.at(i);
}
template <class T>
int DIRSTRUCT<T>::DataCount() //数据集数目
{
return data.size();
}
template <class T>
int DIRSTRUCT<T>::DirCount() //子目录数
{
return SubDir.size();
}
template <class T>
DIRSTRUCT<T>* DIRSTRUCT<T>::GetChild(int i) //索引子目录
{
return SubDir.at(i);
}
template <class T>
DIRSTRUCT<T>* DIRSTRUCT<T>::operator[](int i) //索引子目录
{
return SubDir.at(i);
}
template <class T>
DIRSTRUCT<T>* DIRSTRUCT<T>::GetParent() //获取父目录
{
return lpParentDir;
}
template <class T>
bool DIRSTRUCT<T>::IsChild() //是否为子目录
{
return lpParentDir;
}
template <class T>
bool DIRSTRUCT<T>::IsChild(DIRSTRUCT<T>* lpDir) //是否为lpDir的子孙目录
{
for(DIRSTRUCT<T>*pDir=this;pDir;pDir=pDir->GetParent())
if(pDir==lpDir)
return true;
return false;
}
template <class T>
void DIRSTRUCT<T>::ClearValue() //清空数据
{
data.clear();
}
template <class T>
void DIRSTRUCT<T>::clear() //清空整个结构
{
Delete(this);
}
#endif //_DIR_IMPLENT_
使用时#include "dir.h"
[此贴子已经被作者于2007-6-23 11:34:08编辑过]