00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef SORTABLEARRAY_TEMPLATE_H
00024 #define SORTABLEARRAY_TEMPLATE_H
00025
00026 #include <string.h>
00027
00032 template<class T>
00033 class SortableArray {
00034 private:
00036 T *data;
00037
00039 int sz;
00040
00042 float resizeFactor;
00043
00046 int currSize;
00047
00048
00049 public:
00050 SortableArray(int s = 10, float rsf = 2.0) {
00052 resizeFactor = rsf;
00053
00055 currSize = 0;
00056 sz = (s > 0 ? s : 10);
00057
00059 data = new T[sz];
00060 }
00061
00062 ~SortableArray(void) {
00063 if(data)
00064 delete [] data;
00065 }
00066
00067
00068
00069
00070
00072 int num(void) { return currSize; }
00073
00074
00075
00076
00077
00079 T& operator[](int N) { return item(N); }
00080
00082 int append(const T& val) {
00083 item(currSize) = val;
00084 return currSize - 1;
00085 }
00086
00088 T& item(int N) {
00089
00090
00091
00092
00093 if(N >= sz) {
00094
00095 int newsize = (int)((float)N * resizeFactor + 0.5);
00096
00097
00098
00099
00100
00101 T *newdata = new T[newsize];
00102 if(data) {
00103 memcpy((void *)newdata, (void *)data, currSize * sizeof(T));
00104 delete [] data;
00105 }
00106
00107
00108 data = newdata;
00109 sz = newsize;
00110 }
00111
00112
00113 if(N >= currSize)
00114 currSize = N + 1;
00115
00116
00117 return data[N];
00118 }
00119
00124 void remove(int m = -1, int n = -1) {
00125 if(m < currSize && n < currSize) {
00126 if((m < 0 && n < 0) || (m >= 0 && n < 0) || (m > 0 && n > 0 && m <= n)) {
00127 int N = n, M = (m >= 0 ? m : 0);
00128 if(m < 0 && n < 0)
00129 N = (currSize - 1);
00130 else if(n < 0)
00131 N = M;
00132 else
00133 N = n;
00134 int removed = N - M + 1;
00135 for(int i=N+1; i < currSize; i++)
00136 data[i - removed] = data[i];
00137 currSize -= removed;
00138 }
00139 }
00140 }
00141
00143 void swap (int i, int j) {
00144 T temp;
00145
00146 temp = data[i];
00147 data[i]=data[j];
00148 data[j]=temp;
00149 }
00150
00154 void qsort (int left, int right) {
00155 int i, last;
00156
00157 if (left >= right)
00158 return;
00159 swap (left, (left + right) /2);
00160 last = left;
00161 for (i = left+1; i <=right; i++)
00162 if (data[i] > data[left])
00163 swap (++last, i);
00164 swap (left, last);
00165 qsort (left, last-1);
00166 qsort (last+1, right);
00167 }
00168
00170 void isort () {
00171 int i, j;
00172 T temp;
00173 for (i = currSize-2; i>=0; i--) {
00174 j = i+1;
00175 temp = data[i];
00176 while ((j < currSize) && (temp < data[j])) {
00177 data[j-1] = data[j];
00178 j = j+1;
00179 }
00180 data[j-1] = temp;
00181 }
00182 }
00183 };
00184
00185 #endif