P38.cpp
上传用户:chaiyuqiu
上传日期:2022-08-03
资源大小:27k
文件大小:3k
源码类别:

数据结构

开发平台:

C/C++

  1. #include <iostream.h>
  2. #include <stdlib.h>
  3. #define DefaultSize 10
  4. template < class Type>
  5. class Array {
  6. public:
  7.     Array( int Size = DefaultSize );
  8.     Array( const Array <Type> &x );
  9.     ~Array() { destroy(); }
  10.     Array<Type> &operator = ( const Array<Type> &A);
  11.     Type & operator [] ( int i );
  12. //    Array<Type> operator Type * ()const { return elements; }
  13.     int Length() const { return ArraySize; }
  14.     void ReSize ( int sz);
  15.     friend ostream& operator <<(ostream& , Array<Type>&);
  16. //    void Print();
  17. private:
  18.     Type *elements;
  19.     int ArraySize;
  20.     void getArray();
  21.     void destroy(){delete[] elements;};
  22.     void copyFrom(const Array<Type> &x);
  23. }
  24. template <class Type>
  25. void Array<Type>::copyFrom(const Array<Type> &x)
  26. {
  27.     int n= x.ArraySize;
  28.     ArraySize=n;
  29.     elements = new Type[x.ArraySize];
  30.     if ( elements == 0 )
  31.     {
  32.       cerr << "Memory Allocation Error" << endl;
  33.       ArraySize=0;
  34.       return;
  35.     }
  36.     Type *srcptr = x.elements;
  37.     Type *destptr = elements;
  38.     while (n--) *destptr++ = * srcptr++ ;
  39. };
  40. template <class Type> void Array<Type>::getArray() {
  41.     elements = new Type[ArraySize];
  42.     if ( elements == 0 )
  43.     {
  44.        cerr << "Memory Allocation Error" << endl;
  45.        ArraySize=0;
  46.     }
  47. }
  48. template <class Type> void Array<Type>::Array (int sz) {
  49.     if ( sz <= 0 ) { cerr << "Invalid Array Size" << endl; return; }
  50.     ArraySize = sz;
  51.     getArray();
  52. }
  53. template <class Type> void Array<Type>::Array ( const Array<Type> &x ) {
  54.    copyFrom(x);
  55. }
  56. template <class Type> Type& Array<Type>::operator[] (int i) {
  57.     if ( i < 0 || i > ArraySize - 1 ) cerr << "Index out of Range" << endl;
  58.     return elements[i];
  59. }
  60. template <class Type>
  61. void Array<Type>::ReSize( int sz ) {
  62.     if (( sz <= ArraySize )&&(sz>=0))
  63.     {
  64. Type *newarray = new Type[sz];
  65. if (newarray == 0)
  66. {
  67.   cerr << "Memory Allocation Error" << endl;
  68.   return;
  69. }
  70. int n = ( sz <= ArraySize ) ? sz : ArraySize;
  71. Type *srcptr = elements;
  72. Type *destptr = newarray;
  73. while (n--) *destptr++ = *srcptr++ ;
  74. delete[] elements;
  75. elements = newarray;
  76. ArraySize = sz;
  77.     }
  78. }
  79. template <class Type>
  80. Array<Type> & Array<Type>::operator = ( const Array<Type> &a)
  81. {
  82.    destroy();
  83.    copyFrom(a);
  84.    return *this;
  85. }
  86. template <class Type>
  87. ostream& operator <<(ostream& strm, Array<Type>& a)
  88. {
  89.   Type *p=a.elements;
  90.   strm<<"Len:"<<a.ArraySize<<endl;
  91.   for (int i=0;i<a.ArraySize;i++,p++)
  92.   {
  93.    strm<<*p<<' ';
  94.   }
  95.   strm<<endl;
  96.    return strm;
  97. }
  98. /*
  99. template <class Type>
  100. void Array<Type>::Print()
  101. {
  102.   Type *p=elements;
  103.   cout<<"Len:"<<ArraySize<<endl;
  104.   for (int i=0;i<ArraySize;i++,p++)
  105.   {
  106.    cout<<*p<<' ';
  107.   }
  108.   cout<<endl;
  109. }
  110. */