⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 array.h

📁 自組織映射網路(SOM)
💻 H
字号:
#if !defined(ARRAY_H)

#define ARRAY_H



//------------------------------------------

// 4-dimensional dynamic memory allocation

// template class : Array4D

// 1996.10.12 by CHEN Ching-Han

//------------------------------------------



template <class T>

class Array4D

{

protected:

	void alloc();

	void free();

public:

	int nr;

	int nc;

	int nd;

	int nw;

	T ****m;

	Array4D(){m=0;}

	Array4D(int r,int c,int d, int w){nr=r;nc=c;nd=d;nw=w;alloc();}

	void Initialize(int row, int col, int dep, int wid);

	void Finish(){free();}

	Array4D<T> operator=(Array4D<T>& t);

  	T operator()(int x,int y,int z,int w){return m[x][y][z][w];}

	~Array4D(){}

};





//------------------------------------------

// 3-dimensional dynamic memory allocation

// template class : Array3D

// 1996.10.3 by CHEN Ching-Han

//------------------------------------------



template <class T>

class Array3D

{

protected:

	void alloc();

	void free();

public:

	int nr;

	int nc;

	int nd;

	T ***m;

	int err;

	Array3D(){m=0;}

	Array3D(int r,int c,int d){nr=r;nc=c;nd=d;alloc();}

	void Initialize(int row, int col, int dep);

	void Finish(){free();}

	Array3D<T> operator=(Array3D<T>& t);

  	T& operator()(int ndx, int ndy, int ndz){return m[ndx][ndy][ndz];}

	~Array3D(){}

};



//------------------------------------------

// 2-dimensional dynamic memory allocation

// template class : Array2D

// 1996.10.3 by CHEN Ching-Han

//------------------------------------------



template <class T>

class Array2D

{

protected:

	void alloc();

	void free();

public:

	int nr;

	int nc;

	T **m;

	Array2D(){m=0;}

	Array2D(int row, int col){nr=row;nc=col;alloc();}

	void Initialize(int row, int col);

	void Finish(){free();}

	Array2D<T> operator=(Array2D<T>& m);

  	T& operator()(int ndx, int ndy){return m[ndx][ndy];}

	~Array2D(){}

};



//------------------------------------------

// 1-dimensional dynamic memory allocation

// template class : Array1D

// 1996.10.3 by CHEN Ching-Han

//------------------------------------------



template <class T>

class Array1D

{

protected:

	void alloc();

	void free();

public:

	int nb;

	T *m;

	Array1D(){m=0;}

	Array1D(int n){nb=n;alloc();}

	void Initialize(int n);

	void Finish(){free();}

	Array1D<T>& operator=(Array1D<T>& m);

	T& operator[](int ndx){return m[ndx];}

	~Array1D(){}

};







template <class T>

class FlexArray

{

private:

	int ALLOC_INC;

	int curSize, allocated;

	int maxSize;

	T **items;

	void resize(int);

	int Max(int x, int y){if(x>y)return x;else return y;}

public:

	FlexArray(void);

	FlexArray(int initial);

	~FlexArray(void);

	T& operator[](int);

	FlexArray<T> operator = (FlexArray<T> &);

	int size(void) {return curSize;};

	void setMaximumSize(int);

     void setIncrement(int d){ALLOC_INC = d;}

	int getMaximumSize(void) {return maxSize;};

	void reset(void);

	void remove(int);

	void swap(int,int);

};



//

//----- Definition of the member functions---------

//



template <class T>

void Array4D<T>::alloc()

{

  free();

  m=new T***[nr];

  for(int i=0;i<nr;i++)

  {

    m[i]=new T**[nc];

    for(int j=0;j<nc;j++)

    {

      m[i][j]=new T*[nd];

      for(int k=0;k<nd;k++)m[i][j][k]=new T[nw];

    }

  }

}



template <class T>

void Array4D<T>::Initialize(int row, int col, int dep, int wid)

{

	free();

	nr=row;

	nc=col;

	nd=dep;

  	nw=wid;

	alloc();

}



template <class T>

void Array4D<T>::free( )

{

	if(m){

		for(int i=0;i<nr;i++)

		{

			for(int j=0;j<nc;j++)

			{

      		for(int k=0;k<nd;k++)delete m[i][j][k];

      		delete m[i][j];

			}

			delete m[i];

		}

		delete m;

	}

   m=0;

}



template <class T>

Array4D<T> Array4D<T>::operator=(Array4D<T>& t)

{

	nr=t.nr;

	nc=t.nc;

	nd=t.nd;

  	nw=t.nw;

	m=t.m;

	return *this;

}



template <class T>

void Array3D<T>::alloc()

{

	free();

   m=new T**[nr];

   for(int i=0;i<nr;i++)

   {

   	m[i]=new T*[nc];

     for(int j=0;j<nc;j++)m[i][j]=new T[nd];

   }

}



template <class T>

void Array3D<T>::Initialize(int row, int col, int dep)

{

	if(m!=0)free();

	nr=row;

	nc=col;

	nd=dep;

	alloc();

}



template <class T>

void Array3D<T>::free( )

{

	if (m){

   	for(int i=0;i<nr;i++)

   	{

			for(int j=0;j<nc;j++)delete m[i][j];

			delete m[i];

   	}

   	delete m;

   }

   m=0;

}



template <class T>

Array3D<T> Array3D<T>::operator = (Array3D<T>& t)

{

	nr=t.nr;

	nc=t.nc;

	nd=t.nd;

	m=t.m;

	return *this;

}



//

//  Array2D

//

template <class T>

void Array2D<T>::alloc()

{

  	free();

	m=new T*[nr];

	for(int i=0;i<nr;i++)m[i]=new T[nc];

}



template <class T>

void Array2D<T>::free( )

{

	if(m==0)return;

	for(int i=0;i<nr;i++)delete m[i];

	delete m;

   m=0;

}



template <class T>

void Array2D<T>::Initialize(int row, int col)

{

	if(m!=0)free();

	nr=row;

	nc=col;

	alloc();

}



template <class T>

Array2D<T> Array2D<T>::operator = (Array2D<T>& d)

{

	nr=d.nr;

	nc=d.nc;

	m=d.m;

	return *this;

}



//

//  Array1D

//

template <class T>

void Array1D<T>::alloc()

{

  free();

  m=new T[nb];

}



template <class T>

void Array1D<T>::free( )

{

  if(m) delete m;

  m=0;

}



template <class T>

void Array1D<T>::Initialize(int n)

{

  if(m!=0)free();

  nb=n;

  alloc();

}



template <class T>

Array1D<T>& Array1D<T>::operator=(Array1D<T>& d)

{

  nb=d.nb;

  m=d.m;

  return *this;

}



template <class T>

FlexArray<T>::FlexArray(void)

{

  ALLOC_INC = 5;

  curSize = 0;

  allocated = 0;

  maxSize = 100;

  items = 0;

};





//

// Flexible 1-D Array

//



template <class T>

FlexArray<T>::FlexArray(int initial)

{

  curSize = 0;

  allocated = 0;

  maxSize = initial + 100;

  items = 0;

  (*this)[initial-1];

}



template <class T>

FlexArray<T>::~FlexArray(void)

{

  for(int i=0; i < allocated; i++)	delete items[i];

  if(items)delete items;

};



template <class T>

T& FlexArray<T>::operator[](int index)

{

  resize(index + 1);

  curSize = Max(curSize, index + 1);

  return *(items[index]);

};



template <class T>

FlexArray<T> FlexArray<T>::operator = (FlexArray<T>& lSrc)

{

  int i;

  resize(lSrc.size());

  curSize = lSrc.size();

  maxSize = lSrc.getMaximumSize();

  for (i=0; i<curSize; i++)*(items[i]) = lSrc[i];

  return *this;

};





template <class T>

void FlexArray<T>::resize(int new_size)

{

	if(new_size > allocated)

	{

		int old_size = allocated;

		allocated = Max(allocated + ALLOC_INC, new_size);

		T **new_items = new T * [allocated];

		for(int i=0; i < old_size; i++) new_items[i] = items[i];

		for(int i=old_size; i < allocated; i++)	new_items[i] = new T;

		if(items)delete items;

		items = new_items;

	}

	return;

}







template <class T>

void FlexArray<T>::setMaximumSize(int newSize)

{

	maxSize = newSize;

};





template <class T>

void FlexArray<T>::reset(void)

{

	for (int i=0; i<allocated; i++) delete items[i];

	curSize = 0;

	allocated = 0;

	items = 0;

};





template <class T>

void FlexArray<T>::remove(int index)

{

	if(index < allocated) delete items[index];

	swap(index, allocated-1);

	allocated--;

	curSize--;

	if(curSize == 0) reset();

	return;

};





template <class T>

void FlexArray<T>::swap(int index1,int index2)

{

	T *tempitem;

	if (index1>=maxSize)

	{

//		printf("***Requested table index = %d, table size = %d***",	index1,maxSize);

//		exit(1);

	}

	if (index2>=maxSize)

	{

//		printf("***Requested table index = %d, table size = %d***",	index2,maxSize);

//		exit(1);

	}

	tempitem = items[index1];

	items[index1] = items[index2];

	items[index2] = tempitem;

	curSize = Max(index1+1,curSize);

	curSize = Max(index2+1,curSize);

	return;

};



typedef Array3D <float> f3D;

typedef Array2D <float> f2D;

typedef Array1D <float> f1D;

typedef Array2D<unsigned char> uc2D;

typedef Array1D<unsigned char> uc1D;

typedef Array2D <int> i2D;

typedef Array1D <int> i1D;

typedef Array2D <bool> b2D;

typedef Array1D <bool> b1D;



#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -