打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C# ArrayList C++模仿版
//ArrayList Class //By Justin Lee 2008-11  #define _IN_ #define _OUT_ template<class Type> class ArrayList{ 	//ArrayListClass:Like System.Collections.ArrayList class of .NET 	//But U should manage object space yourself(in other means it would not free object automaticly) 	//We insist you pass pointer type rather than object itself private: 	void* m_pData; #ifndef AL_FAILED//If a Method failed,this value returned #define AL_FAILED -1 #endif public: 	//Constructure Method,Not call by yourself 	ArrayList();  	//Destructure Method,Not call by yourself 	~ArrayList();  	//Copy al to current ArrayList 	void Clone( 		_IN_ ArrayList<Type>& al 		); 	 	//Inside Method,Not call for normally utility 	void* Get_Inside_Data(); 	  	//Get The number of members in ArrayList 	unsigned long GetLength(); 	 	//Get Part of ArrayList 	//Return a new ArrayList 	ArrayList<Type> GetSubList( 		_IN_ unsigned long position, 		_IN_ unsigned long length 		); 	 	//Get Part of ArrayList 	//The results will saved in a pointer array 	unsigned long GetSubList( 		_IN_ unsigned long position, 		_IN_ unsigned long length, 		_OUT_ Type** pointer_array, 		_IN_ unsigned long array_length 		); 	 	//Insert some members 	//You should saved their pointers in an array first 	unsigned long Insert( 		_IN_ unsigned long position, 		_IN_ unsigned long length, 		_IN_ Type** pointer_array, 		_IN_ unsigned long array_length 		); 	 	//Insert an arraylist 	unsigned long Insert( 		_IN_ unsigned long position, 		_IN_ ArrayList<Type>& al 		); 	 	//Remove some members 	unsigned long Remove( 		_IN_ unsigned long position, 		_IN_ unsigned long length 		); 	 	//Copy the ArrayList 	ArrayList<Type>& operator=( 		_IN_ const ArrayList<Type>& al 		) 	{ 		Clone((ArrayList<Type>&)al); 		return *this; 	};  	//Append a ArrayList to the end of ArrayList 	ArrayList<Type>& operator+( 		_IN_ const ArrayList<Type>& al 		) 	{ 		unsigned long l=GetLength(); 		Insert(l,(ArrayList<Type>&)al); 		return *this; 	};  	//Like method above 	ArrayList<Type>& operator+=( 		_IN_ const ArrayList<Type>& al 		) 	{ 		return *this+al; 	};  	//Refresh the ArrayList for merging the pointers inside 	//This Method can free some space when your operate an ArrayList too much 	//These space may come from many rubbish pointers inside 	void Refresh();  	//Clear the List 	void Clear();  	//Get a Member from the ArrayList 	Type& operator[]( 		_IN_ unsigned long i 		); };   //Implement: //////////////////////////////////////////////////////////////// //Base functions #ifdef WIN32 #include<windows.h>  size_t getpagesize(void){ 	SYSTEM_INFO si; 	GetSystemInfo(&si); 	return (size_t)si.dwPageSize; } #else #include<unistd.h> #endif  #include<exception> #include<memory.h> #include<stdlib.h> #include<math.h> #include<vector>  static size_t PAGE_SIZE=0; static size_t NODE_SIZE=0;  typedef struct n_ode{ 	unsigned long *length; 	unsigned long *size; 	n_ode **parent; 	n_ode **next; 	void **data; }NODE_MT_,*PNODE_MT_;  typedef struct mgr_tree{ 	PNODE_MT_ pParent; 	PNODE_MT_ pChild; 	unsigned long length; }MT_OBJ,*PMT_OBJ;  #define _MT_LENGTH_ 0 #define _MT_SIZE_ 1 #define _MT_PARENT_ 2 #define _MT_NEXT_ 3 #define _MT_DATA_ 4  void MT_Init() { 	if(PAGE_SIZE==0||NODE_SIZE==0){ 		PAGE_SIZE=(unsigned long)getpagesize()-0x80; 		NODE_SIZE=(PAGE_SIZE/sizeof(void*))-4; 	} }  inline bool MT_FillN(void** PN,PNODE_MT_ pn) { 	if(PN==NULL||pn==NULL) 		return false; 	try{ 		pn->length=(unsigned long*)&PN[_MT_LENGTH_]; 		pn->size=(unsigned long*)&PN[_MT_SIZE_]; 		pn->parent=(PNODE_MT_*)&PN[_MT_PARENT_]; 		pn->next=(PNODE_MT_*)&PN[_MT_NEXT_]; 		pn->data=(void**)&PN[_MT_DATA_]; 	} 	catch(...) 	{ 		return false; 	} 	return true; }  inline PNODE_MT_ MT_Get_Node(PMT_OBJ po,unsigned long i,unsigned long& k) { 	PMT_OBJ pt=po; 	PNODE_MT_ pn=pt->pParent,pc=NULL; 	unsigned long j=0,l=0,len=0; 	while(pn!=NULL){ 		l+=*pn->length; 		if(l>i){ 			len=*pn->size; 			i-=l-(*pn->length); 			l=0; 			for(j=0;j<len;j++){ 				pc=(PNODE_MT_)pn->data[j]; 				l+=*pc->length; 				if(l>i){ 					k=i+(*pc->length)-l; 					break; 				} 			} 			return pc; 		} 		pn=*pn->next; 	} 	return NULL; }  inline void* MT_Get(PMT_OBJ po,unsigned long i) { 	if(po==NULL) 		return NULL; 	if(po->length<=i) 		return NULL; 	PNODE_MT_ pn; 	unsigned long k; 	pn=MT_Get_Node(po,i,k); 	return pn->data[k]; }  inline void MT_Get(PMT_OBJ po,void** ptrarray,unsigned long i,unsigned long l) { 	if(po==NULL) 		return; 	if(po->length<=i) 		return; 	PNODE_MT_ pn; 	unsigned long k,len; 	pn=MT_Get_Node(po,i,k); 	if(l<(*pn->length)-k){ 		memcpy(ptrarray,&pn->data[k],l*sizeof(void*)); 		return; 	} 	len=(*pn->length)-k; 	memcpy(ptrarray,&pn->data[k],len*sizeof(void*)); 	ptrarray=&ptrarray[len]; 	l-=len; 	len=0; 	pn=*pn->next; 	while(pn!=NULL){ 		len+=(*pn->length); 		if(len>=l){ 			l-=len-(*pn->length); 			memcpy(ptrarray,pn->data,l*sizeof(void*)); 			return; 		} 		memcpy(ptrarray,pn->data,(*pn->length)*sizeof(void*)); 		ptrarray=&ptrarray[*pn->length]; 		pn=*pn->next; 	} }  inline void MT_Delete_Node(PNODE_MT_ pn) { 	try{ 		free(pn->length); 		free(pn); 	} 	catch(...){ 		return; 	} }  inline PNODE_MT_ MT_Create_Node() { 	PNODE_MT_ pn=(PNODE_MT_)malloc(sizeof(NODE_MT_)); 	void** PN=(void**)malloc(PAGE_SIZE); 	memset((void*)PN,0,PAGE_SIZE); 	if(!MT_FillN(PN,pn)){ 		free(pn); 		free(PN); 		return NULL; 	} 	return pn; }  inline PNODE_MT_ MT_Create_Node(void** ptrarray,unsigned long l) { 	PNODE_MT_ pn=MT_Create_Node(); 	*pn->length=l; 	*pn->size=l; 	memcpy((void*)pn->data,ptrarray,l*sizeof(void*)); 	return pn; }  inline PNODE_MT_ MT_Create_List(void** ptrarray,unsigned long l,PNODE_MT_* plast=NULL) { 	PNODE_MT_ pn=NULL,pb=NULL,ph=NULL; 	unsigned long left=l%NODE_SIZE; 	bool end=false; 	do{ 		if(l<=left){ 			pn=MT_Create_Node(ptrarray,left); 			*pn->length=left; 			*pn->size=left; 			ptrarray=&ptrarray[left]; 			end=true; 		} 		else{ 			pn=MT_Create_Node(ptrarray,NODE_SIZE); 			*pn->length=NODE_SIZE; 			*pn->size=NODE_SIZE; 			ptrarray=&ptrarray[NODE_SIZE]; 		} 		if(ph==NULL){ 			ph=pn; 		} 		if(pb!=NULL){ 			*pb->next=pn; 		} 		pb=pn; 		l-=NODE_SIZE; 	}while(!end); 	if(plast!=NULL){ 		*plast=pn; 	} 	return ph; }  inline void MT_Delete_List(PNODE_MT_ pi,unsigned i,unsigned long l) { 	unsigned long left=0,more=0,k=0; 	PNODE_MT_ pn=*pi->next,pb=NULL; 	if(i+l<=*pi->length){ 		memcpy(&pi->data[i],&pi->data[i+l],((*pi->length)-i-l)*sizeof(void*)); 		*pi->length-=l; 		*pi->size=*pi->length; 		memset(&pi->data[*pi->length],0,(NODE_SIZE-(*pi->length))*sizeof(void*)); 		return; 	} 	more=(*pi->length)-i; 	left=l-more; 	memset(&pi->data[i],0,more*sizeof(void*)); 	*pi->length=i; 	*pi->size=i; 	while(1){ 		k+=*pn->length; 		if(k>=left){ 			left=k-left; 			break; 		} 		pb=*pn->next; 		MT_Delete_Node(pn); 		pn=pb; 	} 	if(left<NODE_SIZE-i){ 		memcpy(&pi->data[i],&pn->data[(*pn->length)-left],left*sizeof(void*)); 		*pi->length+=left; 		*pi->size=*pi->length; 		*pi->next=*pn->next; 		MT_Delete_Node(pn); 		return; 	} 	*pi->next=pn; 	memcpy(pn->data,&pn->data[(*pn->length)-left],left*sizeof(void*)); 	memset(&pn->data[left],0,((*pn->length)-left)*sizeof(void*)); 	*pn->length=left; 	*pn->size=left; }  inline void MT_Insert_List(PNODE_MT_ pi,unsigned i,PNODE_MT_ pit) { 	void** buf=(void**)malloc(NODE_SIZE*sizeof(void*)); 	memset(buf,0,NODE_SIZE*sizeof(void*)); 	unsigned long len=*pi->length,more=0,left=NODE_SIZE-i; 	memcpy(buf,&pi->data[i],(len-i)*sizeof(void*)); 	more=len-i; 	PNODE_MT_ pn=NULL,pb=NULL,pl=NULL,pt=NULL; 	*pi->length=i; 	*pi->size=i; 	while(left>=*pit->length){ 		memcpy(&pi->data[i],pit->data,(*pit->length)*sizeof(void*)); 		left-=*pit->length; 		i+=*pit->length; 		*pi->length+=*pit->length; 		*pi->size=*pi->length; 		pit=*pit->next; 		if(pit==NULL){ 			break; 		} 	} 	pb=*pi->next; 	while(pit!=NULL){ 		pn=MT_Create_Node(); 		memcpy(pn->data,pit->data,(*pit->size)*sizeof(void*)); 		*pn->length=*pit->size; 		*pn->size=*pit->size; 		*pi->next=pn; 		pi=*pi->next; 		pit=*pit->next; 	} 	if((*pi->length)<=NODE_SIZE-more){ 		memcpy(&pi->data[*pi->length],buf,more*sizeof(void*)); 		*pi->length+=more; 		*pi->size=*pi->length; 	} 	else{ 		pn=MT_Create_Node(); 		*pn->length=more; 		*pn->size=more; 		memcpy(pn->data,buf,more*sizeof(void*)); 		*pi->next=pn; 		pi=*pi->next; 	} 	*pi->next=pb; 	free(buf); }  inline void MT_Refresh_List(PNODE_MT_ pch) { 	PNODE_MT_ pn=*pch->next,pt=NULL; 	while(pn!=NULL){ 		if((*pn->length)+(*pch->length)<=NODE_SIZE){ 			memcpy(&pch->data[*pch->length],pn->data,(*pn->length)*sizeof(void*)); 			*pch->length+=*pn->length; 			*pch->size=*pch->length; 			pt=*pn->next; 			MT_Delete_Node(pn); 			pn=pt; 		} 		else{ 			*pch->next=pn; 			pch=pn; 			pn=*pn->next; 		} 	} }  inline void MT_Insert_List(PNODE_MT_ pi,unsigned i,void** ptrarray,unsigned long l) { 	void** buf=(void**)malloc(NODE_SIZE*sizeof(void*)); 	memset(buf,0,NODE_SIZE*sizeof(void*)); 	unsigned long len=*pi->length,more=0,left=0; 	PNODE_MT_ pn=NULL,pb=NULL,pl=NULL,pt=NULL; 	if(l+i<NODE_SIZE){ 		if(l+len<NODE_SIZE){ 			memcpy(&pi->data[i+l+1],&pi->data[i+1],(len-i-1)*sizeof(void*)); 			memcpy(&pi->data[i+1],ptrarray,l*sizeof(void*)); 			*pi->length+=l; 			*pi->size+=l; 			free(buf); 			return; 		} 		else{ 			pn=MT_Create_Node(); 			memcpy(buf,&pi->data[NODE_SIZE-l],(len+l-NODE_SIZE)*sizeof(void*)); 			memcpy(&pi->data[i+l+1],&pi->data[i+1],(NODE_SIZE-l-i-1)*sizeof(void*)); 			memcpy(&pi->data[i+1],ptrarray,l*sizeof(void*)); 			*pi->length=NODE_SIZE; 			*pi->size=NODE_SIZE; 			pb=*pi->next; 			*pi->next=pn; 			*pn->next=pb; 			memcpy(pn->data,buf,(len+l-NODE_SIZE)*sizeof(void*)); 			*pn->length=(len+l-i-1); 			*pn->size=*pn->length; 			free(buf); 			return; 		} 	} 	left=(len-i-1); 	memcpy(buf,&pi->data[i+1],left*sizeof(void*)); 	memcpy(&pi->data[i+1],ptrarray,(NODE_SIZE-i-1)*sizeof(void*)); 	ptrarray=&ptrarray[NODE_SIZE-i-1]; 	l-=NODE_SIZE-i-1; 	*pi->length=NODE_SIZE; 	*pi->size=NODE_SIZE; 	pn=MT_Create_List(ptrarray,l,&pl); 	pb=*pi->next; 	*pi->next=pn; 	len=*pl->length; 	if(len>NODE_SIZE-left){ 		pt=MT_Create_Node(); 		memcpy(&pl->data[len],buf,(NODE_SIZE-len)*sizeof(void*)); 		*pl->length=NODE_SIZE; 		*pl->size=NODE_SIZE; 		*pl->next=pt; 		memcpy(pt->data,&buf[NODE_SIZE-len],(left+len-NODE_SIZE)*sizeof(void*)); 		*pt->length=(left+len-NODE_SIZE); 		*pt->size=*pt->length; 		pl=pt; 	} 	else{ 		memcpy(&pl->data[len],buf,(left)*sizeof(void*)); 		*pl->length=(unsigned long)(*pl->length)+left; 		*pl->size=*pl->length; 	} 	*pl->next=pb; 	free(buf); }  inline MT_OBJ MT_Refresh_OBJ(PNODE_MT_ pfh,PNODE_MT_ pch,PNODE_MT_* pfl=NULL,PNODE_MT_* pcl=NULL) { 	unsigned long i=0,l=0; 	if(pfh==NULL) 		pfh=MT_Create_Node(); 	PNODE_MT_ pn=NULL,pf=pfh,pc=pch; 	*pf->length=0; 	*pf->size=0; 	while(pc!=NULL){ 		if(i>=NODE_SIZE){ 			pn=pf; 			pf=MT_Create_Node(); 			*pn->next=pf; 			i=0; 		} 		(*pf->length)+=(*pc->length); 		(*pf->size)+=1; 		pf->data[i]=(void*)pc; 		*pc->parent=pf; 		i++; 		l+=*pc->length; 		if(pcl!=NULL) 			*pcl=pc; 		pc=*pc->next; 	} 	pn=*pf->next; 	if(pfl!=NULL) 		*pfl=pn; 	while(pn!=NULL){ 		pf=*pn->next; 		MT_Delete_Node(pn); 		pn=pf; 	} 	if(pch==NULL){ 		MT_Delete_Node(pfh); 		pfh=NULL; 	} 	MT_OBJ o; 	o.length=l; 	o.pParent=pfh; 	o.pChild=pch; 	return o; }  inline void MT_Ist(PMT_OBJ po,unsigned long i,void** ptrarray,unsigned long l) { 	i--; 	if(ptrarray==NULL||l==0||po==NULL) 		return; 	if(po->length<=i&&i!=-1){ 		if(po->length!=0) 			return; 		else 			if(i>=0) 				return; 	} 	PNODE_MT_ pfh=NULL,pfl=NULL,pch=NULL,pcl=NULL,pi=NULL; 	unsigned long k; 	//create 	if(po->length==0&&po->pParent==NULL&&po->pChild==NULL){ 		pch=MT_Create_List(ptrarray,l,&pcl); 		*po=MT_Refresh_OBJ(NULL,pch,&pfl,&pcl); 		return; 	} 	//insert 	if(i==-1){ 		pi=po->pChild; 		k=-1; 	} 	else{ 		if((pi=MT_Get_Node(po,i,k))==NULL){ 			return; 		} 	} 	MT_Insert_List(pi,k,ptrarray,l); 	*po=MT_Refresh_OBJ(po->pParent,po->pChild,&pfl,&pcl); }  inline void MT_Ist(PMT_OBJ po,unsigned long i,PMT_OBJ poi) { 	if(po==NULL||poi==NULL||poi->length==0) 		return; 	if(po->length<i){ 		return; 	} 	PNODE_MT_ pfh=NULL,pfl=NULL,pch=NULL,pcl=NULL,pi=NULL; 	unsigned long k; 	if(po->length==0&&po->pParent==NULL&&po->pChild==NULL){ 		pch=MT_Create_Node(); 		MT_Insert_List(pch,0,poi->pChild); 		*po=MT_Refresh_OBJ(NULL,pch,&pfl,&pcl); 		return; 	} 	if(i==po->length){ 		if((pi=MT_Get_Node(po,i-1,k))==NULL) 			return; 		if(*pi->length>=NODE_SIZE){ 			*pi->next=MT_Create_Node(); 			pi=*pi->next; 			k=0; 		} 		else 			k++; 	} 	else{ 		if((pi=MT_Get_Node(po,i,k))==NULL) 			return; 	} 	MT_Insert_List(pi,k,poi->pChild); 	*po=MT_Refresh_OBJ(po->pParent,po->pChild,&pfl,&pcl); }  inline void MT_Del(PMT_OBJ po,unsigned long i,unsigned long l) { 	if(l==0||po==NULL) 		return; 	if(po->length<=i) 		return; 	PNODE_MT_ pfh=NULL,pfl=NULL,pch=NULL,pcl=NULL,pi=NULL; 	unsigned long k=0; 	if((pi=MT_Get_Node(po,i,k))==NULL) 		return; 	try{ 		MT_Delete_List(pi,k,l); 		*po=MT_Refresh_OBJ(po->pParent,po->pChild,&pfl,&pcl); 	} 	catch(...){ 		return; 	} }  inline void MT_Clr(PMT_OBJ po) { 	if(po==NULL) 		return; 	if(po->length==NULL||po->pParent==NULL||po->length==0) 		return; 	PNODE_MT_ pt=po->pChild,pb=NULL; 	while(pt!=NULL){ 		pb=*pt->next; 		MT_Delete_Node(pt); 		pt=pb; 	} 	pt=po->pParent; 	while(pt!=NULL){ 		pb=*pt->next; 		MT_Delete_Node(pt); 		pt=pb; 	} 	po->pChild=NULL; 	po->pParent=NULL; 	po->length=0; }  inline MT_OBJ MT_Get(PMT_OBJ po,unsigned long i,unsigned long l) { 	MT_OBJ o={0}; 	if(po==NULL) 		return o; 	if(po->length<=i||l==0) 		return o; 	PNODE_MT_ pn,pt,ph; 	unsigned long k,len; 	pn=MT_Get_Node(po,i,k); 	pt=MT_Create_Node(); 	ph=pt; 	if(l<(*pn->length)-k){ 		*pt->length=l; 		*pt->size=l; 		memcpy(pt->data,&pn->data[k],l*sizeof(void*)); 		o=MT_Refresh_OBJ(NULL,pt); 		return o; 	} 	len=(*pn->length)-k; 	memcpy(pt->data,&pn->data[k],len*sizeof(void*)); 	*pt->length=len; 	*pt->size=len; 	*pt->next=MT_Create_Node(); 	pt=*pt->next; 	l-=len; 	len=0; 	pn=*pn->next; 	while(pn!=NULL){ 		len+=(*pn->length); 		if(len>=l){ 			l-=len-(*pn->length); 			memcpy(pt->data,pn->data,l*sizeof(void*)); 			*pt->length=l; 			*pt->size=l; 			o=MT_Refresh_OBJ(NULL,ph); 			return o; 		} 		memcpy(pt->data,pn->data,(*pn->length)*sizeof(void*)); 		*pt->length=(*pn->length); 		*pt->size=(*pn->length); 		*pt->next=MT_Create_Node(); 		pt=*pt->next; 		pn=*pn->next; 	} 	return o; }  inline void MT_Ref(PMT_OBJ po) { 	if(po==NULL) 		return; 	if(po->length==NULL||po->pParent==NULL) 		return; 	MT_Refresh_List(po->pChild); 	*po=MT_Refresh_OBJ(po->pParent,po->pChild); }  /////////////////////////////////////////////////////////////////////////////////// //Template implement:  template<class Type> inline void MT_CopyType(PMT_OBJ po) { 	unsigned long i,j,fl,cl; 	PNODE_MT_ pf=NULL,pc=NULL; 	Type *pd=NULL,*pt=NULL; 	pf=po->pParent; 	while(pf!=NULL){ 		fl=*pf->size; 		for(i=0;i<fl;i++){ 			pc=(PNODE_MT_)pf->data[i]; 			cl=*pc->size; 			for(j=0;j<cl;j++){ 				pd=(Type*)pc->data[j]; 				pt=new Type; 				*pt=*pd; 				pc->data[j]=(void*)pt; 			} 		} 		pf=*pf->next; 	} }  template<class Type> inline void MT_CopyType(void** pointer_array,unsigned long l) { 	Type *pd=NULL,*pt=NULL; 	unsigned long i; 	for(i=0;i<l;i++){ 		pt=new Type; 		pd=(Type*)pointer_array[i]; 		*pt=*pd; 		pointer_array[i]=(void*)pt; 	} }  template<class Type> inline void MT_DelType(PMT_OBJ po) { 	unsigned long i,j,fl,cl; 	PNODE_MT_ pf=NULL,pc=NULL; 	Type *pd=NULL,*pt=NULL; 	pf=po->pParent; 	while(pf!=NULL){ 		fl=*pf->size; 		for(i=0;i<fl;i++){ 			pc=(PNODE_MT_)pf->data[i]; 			cl=*pc->size; 			for(j=0;j<cl;j++){ 				pd=(Type*)pc->data[j]; 				delete pd; 				pc->data[j]=NULL; 			} 		} 		pf=*pf->next; 	} }  template<class Type> ArrayList<Type>::ArrayList() { 	MT_Init(); 	try{  		free(m_pData); 	} 	catch(...){ 	} 	m_pData=malloc(sizeof(MT_OBJ)); 	memset(m_pData,0,sizeof(MT_OBJ)); };  template<class Type> ArrayList<Type>::~ArrayList() { 	Clear(); 	free(m_pData); };  template<class Type> void* ArrayList<Type>::Get_Inside_Data() { 	return m_pData; };  template<class Type> void ArrayList<Type>::Clone(ArrayList<Type>& al) { 	PMT_OBJ po=(PMT_OBJ)al.Get_Inside_Data(); 	Clear(); 	PMT_OBJ pr=(PMT_OBJ)m_pData; 	*pr=MT_Get(po,0,po->length); 	MT_CopyType<Type>(pr); };  template<class Type> unsigned long ArrayList<Type>::GetLength() { 	PMT_OBJ po=(PMT_OBJ)m_pData; 	return po->length; };  template<class Type> ArrayList<Type> ArrayList<Type>::GetSubList(unsigned long position,unsigned long length) { 	PMT_OBJ po=(PMT_OBJ)m_pData; 	unsigned long lb=po->length; 	if(position>lb) 		position=lb; 	if(length+position>lb) 		length=lb-position; 	ArrayList<Type> al; 	MT_OBJ mo=MT_Get(po,position,length); 	MT_CopyType<Type>(&mo); 	memcpy(al.Get_Inside_Data(),&mo,sizeof(mo)); 	return al; };  template<class Type> unsigned long ArrayList<Type>::GetSubList(unsigned long position,unsigned long length,Type** pointer_array,unsigned long array_length) { 	PMT_OBJ po=(PMT_OBJ)m_pData; 	unsigned long lb=po->length; 	if(position>lb) 		position=lb; 	if(array_length<length) 		length=array_length; 	if(position+length>lb) 		length=lb-position; 	try{ 		MT_Get(po,(void**)pointer_array,position,length); 		MT_CopyType<Type>((void**)pointer_array,length); 	} 	catch(...){ 		return AL_FAILED; 	} 	return length; };  template<class Type> unsigned long ArrayList<Type>::Insert(unsigned long position,unsigned long length,Type** pointer_array,unsigned long array_length) { 	PMT_OBJ po=(PMT_OBJ)m_pData; 	unsigned long lb=po->length; 	if(position>lb) 		position=lb; 	if(array_length<length) 		length=array_length; 	void** pa=(void**)malloc(sizeof(void*)*length); 	try{ 		memcpy(pa,pointer_array,sizeof(void*)*length); 		MT_CopyType<Type>((void**)pa,length); 		MT_Ist(po,position,(void**)pa,length); 	} 	catch(...){ 		free(pa); 		return AL_FAILED; 	} 	free(pa); 	return po->length-lb; };  template<class Type> unsigned long ArrayList<Type>::Insert(unsigned long position,ArrayList<Type>& al) { 	PMT_OBJ po=(PMT_OBJ)m_pData; 	unsigned long lb=po->length; 	if(position>lb) 		position=lb; 	PMT_OBJ pi=(PMT_OBJ)al.m_pData; 	PMT_OBJ pt=(PMT_OBJ)malloc(sizeof(MT_OBJ)); 	try{ 		*pt=MT_Get(pi,0,pi->length); 		MT_CopyType<Type>(pt); 		MT_Ist(po,position,pt); 	} 	catch(...){ 		free(pt); 		return AL_FAILED; 	} 	free(pt); 	return po->length-lb; };  template<class Type> unsigned long ArrayList<Type>::Remove(unsigned long position,unsigned long length) { 	PMT_OBJ po=(PMT_OBJ)m_pData; 	unsigned long lb=po->length; 	if(position>lb) 		position=lb; 	if(position+length>lb) 		length=lb-position; 	PMT_OBJ pt=(PMT_OBJ)malloc(sizeof(MT_OBJ)); 	try{ 		*pt=MT_Get(po,position,length); 		MT_DelType<Type>(pt); 		MT_Clr(pt); 		MT_Del(po,position,length); 	} 	catch(...){ 		free(pt); 		return AL_FAILED; 	} 	free(pt); 	return lb-po->length; };  template<class Type> void ArrayList<Type>::Clear() { 	try{ 		MT_DelType<Type>((PMT_OBJ)m_pData); 		MT_Clr((PMT_OBJ)m_pData); 	} 	catch(...){ 	} 	memset(m_pData,0,sizeof(MT_OBJ)); };  template<class Type> Type& ArrayList<Type>::operator[](unsigned long i) { 	PMT_OBJ po=(PMT_OBJ)m_pData; 	unsigned long lb=po->length; 	if(i>=lb) 		i=lb-1; 	Type* p=NULL; 	try{ 		p=(Type*)MT_Get(po,i); 	} 	catch(...){ 	} 	return *p; };  template<class Type> void ArrayList<Type>::Refresh() { 	PMT_OBJ po=(PMT_OBJ)m_pData; 	unsigned long lb=po->length; 	if(lb==0) 		return; 	try{ 		MT_Ref(po); 	} 	catch(...){ 	} 	return; }  ////////////////////////////////////////////////// //Windows Test samples /* #include<windows.h> #include<stdio.h> #include<stdlib.h> #include<time.h> #include<Psapi.h> #pragma comment(lib,"Psapi.lib")  ArrayList<unsigned long>* makeAL() { 	ArrayList<unsigned long> *pal=new ArrayList<unsigned long>; 	unsigned long *k=(unsigned long*)malloc(sizeof(unsigned long)*0x3000); 	unsigned long **p=(unsigned long**)malloc(sizeof(unsigned long*)*0x3000); 	unsigned long i; 	for(i=0;i<0x3000;i++){ 		k[i]=i; 		p[i]=&k[i]; 	} 	pal->Insert(0,0x3000,p,0x3000); 	free(p); 	free(k); 	return pal; }  void main(){ 	ArrayList<unsigned long> al1,*pal1,al2,*pal2; 	pal1=makeAL(); 	HANDLE hProc=GetModuleHandle(NULL); 	PROCESS_MEMORY_COUNTERS pmc={0}; 	DWORD sz=sizeof(pmc); 	pmc.cb=sz; 	pal2=new ArrayList<unsigned long>; 	*pal2=*pal1; 	*pal1+=*pal2; 	al1=*pal1; 	delete pal1; 	delete pal2; 	//al2=al1; 	al1.Refresh(); 	unsigned long i,t1,t2=0; 	time_t t; 	srand((unsigned int)time(&t)); 	char out[100]={0}; 	for(i=0;i<100;i++){ 		t1=(unsigned long)(rand()%0x6000); 		t2=al1[t1]; 		wsprintfA(out,"Pos %x : %lx\n",t1,t2); 		OutputDebugStringA(out); 	} } */
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
OpenGL利用矩阵对模型进行变换
用c语言产生随机数 - meizhe143的日志 - 网易博客
线性表顺序存储(c实现)
用C语言举例讲解数据结构中的算法复杂度结与顺序表
堆与链表
C++内存管理详解(3)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服