00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
#define NO_DEBUG
00027
#ifndef VDKARRAY_H
00028
#define VDKARRAY_H
00029
00030
00031
00032
00033
00034
00072 template <
class T>
class VDKArray
00073 {
00074
00075
private:
00076
00077
00078
00079
00083 T& At(
int ndx)
00084 {
00085
return start[ndx-1];
00086 }
00087
protected:
00088
int xDim;
00089 T* start;
00090
public:
00095 VDKArray(
int n = 0):xDim(n),start(n ? new T[n]: (T*) NULL)
00096 {
00097 }
00101
VDKArray(
const VDKArray&);
00105
VDKArray& operator=(
const VDKArray&);
00109 virtual ~VDKArray()
00110 {
00111
if(start)
00112
delete[] start;
00113 }
00117 int size()
00118 {
00119
return xDim ;
00120 }
00124
void resize(
int);
00125
00126
00138 T& operator[](
int ndx)
00139 {
00140
return start[ndx];
00141 }
00142
const T& operator[](
int ndx)
const
00143
{
00144
return start[ndx];
00145 }
00146
00154
VDKArray<T>&
Heapsort();
00158
virtual int operator==(
VDKArray<T>& m);
00159 };
00160
00161
00162
00163
template <
class T>
00164 VDKArray<T>::VDKArray(
const VDKArray<T> &v)
00165 {
00166 xDim = v.
xDim;
00167 start =
new T[xDim];
00168
for(
register int i = 0;i < xDim; i++) start[i] = v.
start[i];
00169 }
00170
00171
template <
class T>
00172 void VDKArray<T>::resize(
int ns)
00173 {
00174 T* temp =
new T[ns];
00175 T* pstart = start,*ptemp = temp;
00176
00177
int s = (ns > xDim) ? xDim : ns;
00178
00179
for(
register int i = 0;i < s; i++) *ptemp++ = *pstart++;
00180
00181
delete[] start;
00182 start = temp;
00183 xDim = ns;
00184 }
00185
00186
template <
class T>
00187 VDKArray<T>&
VDKArray<T>::operator=(
const VDKArray<T>&v)
00188 {
00189
00190
if(
this !=&v)
00191 {
00192
if(start)
delete[] start;
00193 xDim = v.
xDim;
00194 start=
new T[xDim];
00195
for(
register int i = 0;i < xDim; i++)
00196 start[i] = v.
start[i];
00197 }
00198
return *
this;
00199 }
00200
00201
template <
class T>
int
00202 VDKArray<T>::operator==(
VDKArray<T>& m)
00203 {
00204
if(xDim != m.
xDim)
return 0;
00205
register int i;
00206
for(i = 0;
00207 (i < xDim) &&
00208 ((*this)[i] == m[i]); i++) ;
00209
return i == xDim ? 1 : 0 ;
00210 }
00211
00212
00213
00214
template <
class T>
00215 VDKArray<T>&
VDKArray<T>::Heapsort()
00216 {
00217
unsigned int n =
size();
00218
unsigned int i,ir,j,l;
00219 T rra;
00220
if(n<2)
return *
this;
00221 l = (n >> 1)+1;
00222 ir=n;
00223
for(;;)
00224 {
00225
if (l > 1) rra =
At(--l);
00226
else
00227 {
00228 rra = At(ir); At(ir) = At(1);
00229
if(--ir == 1)
00230 {
00231 At(1) = rra;
break;
00232 }
00233 }
00234 i = l; j = l+l;
00235
while(j <= ir)
00236 {
00237
if(j < ir && At(j) < At(j+1) ) j++;
00238
if(rra < At(j))
00239 {
00240 At(i) = At(j); i = j; j <<= 1;
00241 }
00242
else j = ir+1;
00243 }
00244 At(i) = rra;
00245 }
00246
return *
this;
00247 }
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
#endif
00259
00260
00261
00262
00263