redefine template Map

This commit is contained in:
hyzboy 2020-07-25 15:14:00 +08:00
parent dcaf7f8960
commit 081c7fd931
2 changed files with 134 additions and 147 deletions

View File

@ -8,8 +8,8 @@ namespace hgl
* @param flag * @param flag
* @return -1 * @return -1
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
int _Map<F,T,DataPair>::Find(const F &flag)const int _Map<K,V,DataPair>::Find(const K &flag)const
{ {
int left=0,right=data_list.GetCount()-1; //使用left,right而不使用min,max是为了让代码能够更好的阅读。 int left=0,right=data_list.GetCount()-1; //使用left,right而不使用min,max是为了让代码能够更好的阅读。
int mid; int mid;
@ -41,8 +41,8 @@ namespace hgl
return(-1); return(-1);
} }
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
bool _Map<F,T,DataPair>::FindPos(const F &flag,int &pos)const bool _Map<K,V,DataPair>::FindPos(const K &flag,int &pos)const
{ {
int left=0,right=data_list.GetCount()-1; int left=0,right=data_list.GetCount()-1;
int mid; int mid;
@ -124,8 +124,8 @@ namespace hgl
return(false); return(false);
} }
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
int _Map<F,T,DataPair>::FindByValue(const T &data)const int _Map<K,V,DataPair>::FindByValue(const V &data)const
{ {
const int count=data_list.GetCount(); const int count=data_list.GetCount();
@ -148,51 +148,33 @@ namespace hgl
* @param data * @param data
* @return * @return
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
DataPair *_Map<F,T,DataPair>::Add(const F &flag,const T &data) DataPair *_Map<K,V,DataPair>::Add(const K &flag,const V &data)
{ {
DataPair *ds=data_pool.Acquire(); DataPair *dp;
ds->left=flag; if(!data_pool.Acquire(dp))
ds->right=data; return(nullptr);
dp->left=flag;
dp->right=data;
int pos; int pos;
if(FindPos(flag,pos)) if(FindPos(flag,pos))
return(nullptr); return(nullptr);
data_list.Insert(pos,ds); data_list.Insert(pos,dp);
return(ds); return(dp);
}
/**
*
* @param flag
* @return
*/
template<typename F,typename T,typename DataPair>
T &_Map<F,T,DataPair>::Add(const F &flag)
{
DataPair *ds=data_pool.Acquire();
ds->left=flag;
int pos;
FindPos(flag,pos);
data_list.Insert(pos,ds);
return ds->right;
} }
/** /**
* *
* @param obj * @param obj
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
void _Map<F,T,DataPair>::Add(DataPair *obj) void _Map<K,V,DataPair>::Add(DataPair *obj)
{ {
data_list.Insert(FindPos(obj->left),obj); data_list.Insert(FindPos(obj->left),obj);
} }
@ -203,8 +185,8 @@ namespace hgl
* @param data * @param data
* @return * @return
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
bool _Map<F,T,DataPair>::Get(const F &flag,T &data) const bool _Map<K,V,DataPair>::Get(const K &flag,V &data) const
{ {
int index=Find(flag); int index=Find(flag);
@ -218,8 +200,8 @@ namespace hgl
return(true); return(true);
} }
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
bool _Map<F,T,DataPair>::Check(const F &key,const T &value) const bool _Map<K,V,DataPair>::Check(const K &key,const V &value) const
{ {
int index=Find(key); int index=Find(key);
@ -238,8 +220,8 @@ namespace hgl
* @param t * @param t
* @return * @return
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
bool _Map<F,T,DataPair>::GetBySerial(int index,F &f,T &t) const bool _Map<K,V,DataPair>::GetBySerial(int index,K &f,V &t) const
{ {
if(index<0||index>=data_list.GetCount())return(false); if(index<0||index>=data_list.GetCount())return(false);
@ -257,8 +239,8 @@ namespace hgl
* @param f * @param f
* @return * @return
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
bool _Map<F,T,DataPair>::GetKey(int index,F &f) bool _Map<K,V,DataPair>::GetKey(int index,K &f)
{ {
if(index<0||index>=data_list.GetCount())return(false); if(index<0||index>=data_list.GetCount())return(false);
@ -275,8 +257,8 @@ namespace hgl
* @param t * @param t
* @return * @return
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
bool _Map<F,T,DataPair>::GetValue(int index,T &t) bool _Map<K,V,DataPair>::GetValue(int index,V &t)
{ {
if(index<0||index>=data_list.GetCount())return(false); if(index<0||index>=data_list.GetCount())return(false);
@ -294,8 +276,8 @@ namespace hgl
* @param index * @param index
* @param t * @param t
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
bool _Map<F,T,DataPair>::SetValueBySerial(int index,T &t) bool _Map<K,V,DataPair>::SetValueBySerial(int index,V &t)
{ {
if(index<0||index>=data_list.GetCount())return(false); if(index<0||index>=data_list.GetCount())return(false);
@ -310,8 +292,8 @@ namespace hgl
* @param data * @param data
* @return * @return
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
bool _Map<F,T,DataPair>::Delete(const F &flag,T &data) bool _Map<K,V,DataPair>::Delete(const K &flag,V &data)
{ {
int index=Find(flag); int index=Find(flag);
@ -333,8 +315,8 @@ namespace hgl
* @param flag * @param flag
* @return * @return
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
bool _Map<F,T,DataPair>::DeleteByKey(const F &flag) bool _Map<K,V,DataPair>::DeleteByKey(const K &flag)
{ {
return DeleteBySerial(Find(flag)); return DeleteBySerial(Find(flag));
} }
@ -345,8 +327,8 @@ namespace hgl
* @param count * @param count
* @return * @return
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
int _Map<F,T,DataPair>::DeleteByKey(const F *fp,const int count) int _Map<K,V,DataPair>::DeleteByKey(const K *fp,const int count)
{ {
if(!fp||count<=0)return(0); if(!fp||count<=0)return(0);
@ -369,8 +351,8 @@ namespace hgl
* @param data * @param data
* @return * @return
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
bool _Map<F,T,DataPair>::DeleteByValue(const T &data) bool _Map<K,V,DataPair>::DeleteByValue(const V &data)
{ {
return DeleteBySerial(FindByValue(data)); return DeleteBySerial(FindByValue(data));
} }
@ -380,8 +362,8 @@ namespace hgl
* @param index * @param index
* @return * @return
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
bool _Map<F,T,DataPair>::DeleteBySerial(int index) bool _Map<K,V,DataPair>::DeleteBySerial(int index)
{ {
if(index<0 if(index<0
||index>=data_list.GetCount())return(false); ||index>=data_list.GetCount())return(false);
@ -398,8 +380,8 @@ namespace hgl
* @param number * @param number
* @return * @return
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
bool _Map<F,T,DataPair>::DeleteBySerial(int start,int number) bool _Map<K,V,DataPair>::DeleteBySerial(int start,int number)
{ {
DataPair **dp=data_list.GetData()+start; DataPair **dp=data_list.GetData()+start;
@ -417,27 +399,35 @@ namespace hgl
* @param flag * @param flag
* @param data * @param data
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
void _Map<F,T,DataPair>::Update(const F &flag,const T &data) bool _Map<K,V,DataPair>::Update(const K &flag,const V &data)
{ {
int result; int result;
DataPair *dp;
if(FindPos(flag,result)) if(FindPos(flag,result))
{ {
DataPair *dp=GetListObject(data_list,result); dp=GetListObject(data_list,result);
if(dp) if(dp)
{
dp->right=data; dp->right=data;
return(true);
}
} }
else else
{ {
DataPair *ds=data_pool.Acquire(); if(data_pool.Acquire(dp))
{
dp->left=flag;
dp->right=data;
ds->left=flag; data_list.Insert(result,dp);
ds->right=data; return(true);
}
data_list.Insert(result,ds);
} }
return(false);
} }
/** /**
@ -446,8 +436,8 @@ namespace hgl
* @param data * @param data
* @param return * @param return
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
bool _Map<F,T,DataPair>::Change(const F &flag,const T &data) bool _Map<K,V,DataPair>::Change(const K &flag,const V &data)
{ {
DataPair *dp=GetListObject(data_list,Find(flag)); DataPair *dp=GetListObject(data_list,Find(flag));
@ -461,8 +451,8 @@ namespace hgl
/** /**
* *
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
void _Map<F,T,DataPair>::Clear() void _Map<K,V,DataPair>::Clear()
{ {
data_pool.ClearAll(); data_pool.ClearAll();
data_list.Clear(); data_list.Clear();
@ -471,15 +461,15 @@ namespace hgl
/** /**
* *
*/ */
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
void _Map<F,T,DataPair>::ClearData() void _Map<K,V,DataPair>::ClearData()
{ {
data_pool.ReleaseAll(); data_pool.ReleaseAll();
data_list.ClearData(); data_list.ClearData();
} }
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
void _Map<F,T,DataPair>::operator=(const _Map<F,T,DataPair> &ftd) void _Map<K,V,DataPair>::operator=(const _Map<K,V,DataPair> &ftd)
{ {
Clear(); Clear();
@ -491,11 +481,13 @@ namespace hgl
if(count<=0) if(count<=0)
return; return;
IDItem **obj=ftd.data_list.GetData(); DataPair **obj=ftd.data_list.GetData();
DataPair *new_obj;
for(int i=0;i<count;i++) for(int i=0;i<count;i++)
{ {
IDItem *new_obj=data_pool.Acquire(); if(!data_pool.Acquire(new_obj))
break;
new_obj->left=(*obj)->left; new_obj->left=(*obj)->left;
new_obj->right=(*obj)->right; new_obj->right=(*obj)->right;
@ -506,15 +498,15 @@ namespace hgl
} }
} }
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
void _Map<F,T,DataPair>::Enum(void (*enum_func)(const F &,T)) void _Map<K,V,DataPair>::Enum(void (*enum_func)(const K &,V))
{ {
const int count=data_list.GetCount(); const int count=data_list.GetCount();
if(count<=0) if(count<=0)
return; return;
IDItem **idp=data_list.GetData(); DataPair **idp=data_list.GetData();
for(int i=0;i<count;i++) for(int i=0;i<count;i++)
{ {
@ -524,15 +516,15 @@ namespace hgl
} }
} }
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
void _Map<F,T,DataPair>::EnumKey(void (*enum_func)(const F &)) void _Map<K,V,DataPair>::EnumKey(void (*enum_func)(const K &))
{ {
const int count=data_list.GetCount(); const int count=data_list.GetCount();
if(count<=0) if(count<=0)
return; return;
IDItem **idp=data_list.GetData(); DataPair **idp=data_list.GetData();
for(int i=0;i<count;i++) for(int i=0;i<count;i++)
{ {
@ -542,15 +534,15 @@ namespace hgl
} }
} }
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
void _Map<F,T,DataPair>::EnumAllValue(void (*enum_func)(T)) void _Map<K,V,DataPair>::EnumAllValue(void (*enum_func)(V))
{ {
const int count=data_list.GetCount(); const int count=data_list.GetCount();
if(count<=0) if(count<=0)
return; return;
IDItem **idp=data_list.GetData(); DataPair **idp=data_list.GetData();
for(int i=0;i<count;i++) for(int i=0;i<count;i++)
{ {
@ -560,15 +552,15 @@ namespace hgl
} }
} }
template<typename F,typename T,typename DataPair> template<typename K,typename V,typename DataPair>
void _Map<F,T,DataPair>::EnumValue(bool (*enum_func)(T)) void _Map<K,V,DataPair>::EnumValue(bool (*enum_func)(V))
{ {
const int count=data_list.GetCount(); const int count=data_list.GetCount();
if(count<=0) if(count<=0)
return; return;
IDItem **idp=data_list.GetData(); DataPair **idp=data_list.GetData();
for(int i=0;i<count;i++) for(int i=0;i<count;i++)
{ {

View File

@ -10,18 +10,14 @@ namespace hgl
/** /**
* *
*/ */
template<typename F,typename T,typename DataPair> class _Map template<typename K,typename V,typename DataPair> class _Map
{ {
public:
using IDItem=DataPair;
protected: protected:
ObjectPool<IDItem> data_pool; ObjectPool<DataPair> data_pool;
List<IDItem *> data_list; List<DataPair *> data_list;
using this_calss=_Map<F,T,IDItem>; using this_calss=_Map<K,V,DataPair>;
public: //方法 public: //方法
@ -30,40 +26,39 @@ namespace hgl
const int GetCount()const{return data_list.GetCount();} ///<取得数据总量 const int GetCount()const{return data_list.GetCount();} ///<取得数据总量
IDItem * Add(const F &,const T &); ///<添加一个数据数果索引已存在返回nullptr DataPair * Add(const K &,const V &); ///<添加一个数据数果索引已存在返回nullptr
T & Add(const F &); ///<添加一个数据 void Add(DataPair *); ///<添加一个数据
void Add(IDItem *); ///<添加一个数据 bool FindPos(const K &,int &)const; ///<查找数据如果插入后,会所在的位置,返回是否存在这个数据
bool FindPos(const F &,int &)const; ///<查找数据如果插入后,会所在的位置,返回是否存在这个数据 int FindPos(const K &flag)const{int pos;FindPos(flag,pos);return(pos);} ///<查找数据如果插入后,会所在的位置
int FindPos(const F &flag)const{int pos;FindPos(flag,pos);return(pos);} ///<查找数据如果插入后,会所在的位置 int Find(const K &)const; ///<查找数据是否存在,返回-1表示数据不存在
int Find(const F &)const; ///<查找数据是否存在,返回-1表示数据不存在 int FindByValue(const V &)const; ///<查找数据是否存在,返回-1表示数据不存在
int FindByValue(const T &)const; ///<查找数据是否存在,返回-1表示数据不存在 bool KeyExist(const K &key)const{return(Find(key)!=-1);} ///<确认这个数据是否存在
bool KeyExist(const F &key)const{return(Find(key)!=-1);} ///<确认这个数据是否存在 bool ValueExist(const V &value)const{return(FindByValue(value)!=-1);} ///<确认这个数据是否存在
bool ValueExist(const T &value)const{return(FindByValue(value)!=-1);} ///<确认这个数据是否存在 bool Check(const K &key,const V &value)const; ///<确认数据是否是这个
bool Check(const F &key,const T &value)const; ///<确认数据是否是这个 virtual bool Get(const K &,V &) const; ///<取得数据
virtual bool Get(const F &,T &) const; ///<取得数据 virtual bool Delete(const K &,V &); ///<将指定数据从列表中移除,并获得这个数据
virtual bool Delete(const F &,T &); ///<将指定数据从列表中移除,并获得这个数据 virtual bool DeleteByKey(const K &); ///<根据索引将指定数据从列表中移除
virtual bool DeleteByKey(const F &); ///<根据索引将指定数据从列表中移除 virtual int DeleteByKey(const K *,const int); ///<根据索引将指定数据从列表中批量移除
virtual int DeleteByKey(const F *,const int); ///<根据索引将指定数据从列表中批量移除 virtual bool DeleteByValue(const V &); ///<根据数据将指定数据从列表中移除
virtual bool DeleteByValue(const T &); ///<根据数据将指定数据从列表中移除
virtual bool DeleteBySerial(int); ///<根据序号将指定数据从列表中移除 virtual bool DeleteBySerial(int); ///<根据序号将指定数据从列表中移除
virtual bool DeleteBySerial(int,int); ///<根据序号将指定数据从列表中移除 virtual bool DeleteBySerial(int,int); ///<根据序号将指定数据从列表中移除
virtual void Update(const F &,const T &); ///<更新一个数据的内容(如不存在则添加) virtual bool Update(const K &,const V &); ///<更新一个数据的内容(如不存在则添加)
virtual bool Change(const F &,const T &); ///<更改一个数据的内容(如不存在则更改失效) virtual bool Change(const K &,const V &); ///<更改一个数据的内容(如不存在则更改失效)
virtual void Clear(); ///<清除所有数据 virtual void Clear(); ///<清除所有数据
virtual void ClearData(); ///<清除所有数据,但不释放内存 virtual void ClearData(); ///<清除所有数据,但不释放内存
List<IDItem *> &GetList(){return data_list;} ///<取得线性列表 List<DataPair *> & GetList(){return data_list;} ///<取得线性列表
IDItem ** GetDataList()const{return data_list.GetData();} ///<取得纯数据线性列表 DataPair ** GetDataList()const{return data_list.GetData();} ///<取得纯数据线性列表
template<typename IT> template<typename IT>
int GetKey(IT &il_list) ///<取得所有索引合集 int GetKey(IT &il_list) ///<取得所有索引合集
{ {
const int count=data_list.GetCount(); const int count=data_list.GetCount();
if(count<=0) if(count<=0)
return count; return count;
IDItem **idp=data_list.GetData(); DataPair **idp=data_list.GetData();
for(int i=0;i<count;i++) for(int i=0;i<count;i++)
{ {
@ -82,7 +77,7 @@ namespace hgl
if(count<=0) if(count<=0)
return count; return count;
IDItem **idp=data_list.GetData(); DataPair **idp=data_list.GetData();
for(int i=0;i<count;i++) for(int i=0;i<count;i++)
{ {
@ -93,22 +88,22 @@ namespace hgl
return count; return count;
} }
IDItem *GetItem(int n){return GetListObject(data_list,n);} ///<取指定序号的数据 DataPair * GetItem(int n){return GetListObject(data_list,n);} ///<取指定序号的数据
bool GetBySerial(int,F &,T &) const; ///<取指定序号的数据 bool GetBySerial(int,K &,V &) const; ///<取指定序号的数据
bool GetKey(int,F &); ///<取指定序号的索引 bool GetKey(int,K &); ///<取指定序号的索引
bool GetValue(int,T &); ///<取指定序号的数据 bool GetValue(int,V &); ///<取指定序号的数据
bool SetValueBySerial(int,T &); ///<根据序号设置数据 bool SetValueBySerial(int,V &); ///<根据序号设置数据
void operator=(const _Map<F,T,IDItem> &); ///<操作符重载,复制一个列表 void operator=(const _Map<K,V,DataPair> &); ///<操作符重载,复制一个列表
void Enum(void (*enum_func)(const F &,T)); ///<枚举所有数据项 void Enum(void (*enum_func)(const K &,V)); ///<枚举所有数据项
void EnumKey(void (*enum_func)(const F &)); ///<枚举所有索引 void EnumKey(void (*enum_func)(const K &)); ///<枚举所有索引
void EnumAllValue(void (*enum_func)(T)); ///<枚举所有数值 void EnumAllValue(void (*enum_func)(V)); ///<枚举所有数值
void EnumValue(bool (*enum_func)(T)); ///<枚举所有数值(返回true/false表示是否继续) void EnumValue(bool (*enum_func)(V)); ///<枚举所有数值(返回true/false表示是否继续)
};//class _Map };//class _Map
template<typename F,typename T> class Map:public _Map<F,T,Pair<F,T> > template<typename K,typename V> class Map:public _Map<K,V,Pair<K,V> >
{ {
public: public:
@ -126,13 +121,13 @@ namespace hgl
return result; return result;
} }
template<typename F,typename T,typename DataPair> class _MapObject:public _Map<F,T *,DataPair> template<typename K,typename V,typename DataPair> class _MapObject:public _Map<K,V *,DataPair>
{ {
protected: protected:
typedef _Map<F,T *,DataPair> SuperClass; typedef _Map<K,V *,DataPair> SuperClass;
virtual void DeleteObject(const F &,T *)=0; ///<删除一个数据 virtual void DeleteObject(const K &,V *)=0; ///<删除一个数据
void DeleteObject(DataPair *ds) void DeleteObject(DataPair *ds)
{ {
if(!ds)return; if(!ds)return;
@ -163,7 +158,7 @@ namespace hgl
* @param flag * @param flag
* @return * @return
*/ */
bool UnlinkByKey(const F &flag) bool UnlinkByKey(const K &flag)
{ {
return UnlinkBySerial(SuperClass::Find(flag)); return UnlinkBySerial(SuperClass::Find(flag));
} }
@ -173,7 +168,7 @@ namespace hgl
* @param tp * @param tp
* @return * @return
*/ */
bool UnlinkByValue(T *tp) bool UnlinkByValue(V *tp)
{ {
return UnlinkBySerial(this->FindByValue(tp)); return UnlinkBySerial(this->FindByValue(tp));
} }
@ -205,7 +200,7 @@ namespace hgl
* @param flag * @param flag
* @return * @return
*/ */
bool DeleteByKey(const F &flag) bool DeleteByKey(const K &flag)
{ {
return DeleteBySerial(SuperClass::Find(flag)); return DeleteBySerial(SuperClass::Find(flag));
} }
@ -215,7 +210,7 @@ namespace hgl
* @param tp * @param tp
* @return * @return
*/ */
bool DeleteByValue(T *tp) bool DeleteByValue(V *tp)
{ {
return DeleteBySerial(this->FindByValue(tp)); return DeleteBySerial(this->FindByValue(tp));
} }
@ -245,7 +240,7 @@ namespace hgl
while(n--) while(n--)
DeleteObject(n); DeleteObject(n);
_Map<F,T *,DataPair>::Clear(); _Map<K,V *,DataPair>::Clear();
} }
/** /**
@ -253,7 +248,7 @@ namespace hgl
* @param flag * @param flag
* @param data * @param data
*/ */
void Update(const F &flag,T *data) void Update(const K &flag,V *data)
{ {
int index=this->Find(flag); int index=this->Find(flag);
@ -278,7 +273,7 @@ namespace hgl
* @param data * @param data
* @param return * @param return
*/ */
bool Change(const F &flag,T *data) bool Change(const K &flag,V *data)
{ {
int index=this->Find(flag); int index=this->Find(flag);
@ -301,33 +296,33 @@ namespace hgl
void Clear(){DeleteAll();} void Clear(){DeleteAll();}
};//class _MapObject };//class _MapObject
template<typename F,typename T,typename DataPair> class CusMapObject:public _MapObject<F,T,DataPair> template<typename K,typename V,typename DataPair> class CusMapObject:public _MapObject<K,V,DataPair>
{ {
protected: protected:
//virtual T * CreateObject(const F &){return(new T);} ///<创建一个数据 //virtual T * CreateObject(const F &){return(new T);} ///<创建一个数据
virtual void DeleteObject(const F &,T *obj){delete obj;} ///<删除一个数据 virtual void DeleteObject(const K &,V *obj){delete obj;} ///<删除一个数据
public: public:
CusMapObject()=default; CusMapObject()=default;
virtual ~CusMapObject() virtual ~CusMapObject()
{ {
_MapObject<F,T,DataPair>::Clear(); _MapObject<K,V,DataPair>::Clear();
} }
};//class CusMapObject };//class CusMapObject
template<typename F,typename T> class MapObject:public CusMapObject<F,T,Pair<F,T *> > template<typename K,typename V> class MapObject:public CusMapObject<K,V,Pair<K,V *> >
{ {
public: public:
MapObject()=default; MapObject()=default;
virtual ~MapObject() virtual ~MapObject()
{ {
CusMapObject<F,T,Pair<F,T *> >::Clear(); CusMapObject<K,V,Pair<K,V *> >::Clear();
} }
T *operator[](const F &index)const V *operator[](const K &index)const
{ {
auto *obj=GetListObject(this->data_list,this->Find(index)); auto *obj=GetListObject(this->data_list,this->Find(index));