25 int IntArray::alloc = 4;
27 IntArray::IntArray(
int start_size)
30 size = (count + alloc) / alloc * alloc;
31 items =
new int [size];
34 IntArray::IntArray(
const IntArray & source)
38 items =
new int [size];
40 for (
int i = 0; i < count; i++)
41 items[i] = source.items[i];
49 void IntArray::Grow(
int new_size)
53 if ((new_size >> 1) >= size)
54 size = (new_size + alloc) / alloc * alloc;
58 while (size <= new_size)
62 int * new_items =
new int [size];
63 for (
int i = 0; i < count; i++)
64 new_items[i] = items[i];
70 int IntArray::Append(
int value)
73 items[count++] = value;
77 int IntArray::Append(
const IntArray & rhs)
79 Grow(count + rhs.count);
80 for (
int i = 0; i < rhs.count; i++)
81 items[count + i] = rhs.items[i];
86 void IntArray::Set(
int value)
88 for (
int i = 0; i < count; i++)
92 void IntArray::SetSequence(
int start,
int increment)
94 for (
int i = 0; i < count; i++, start += increment)
98 int IntArray::Delete(
int index)
102 memmove(items + index, items + index + 1,
sizeof(
int) *(count - index));
106 void IntArray::InsertAt(
int index,
int value)
110 memmove(items + index + 1, items + index,
sizeof(
int) *(count - index));
111 items[index] = value;
119 for (
int i = 0; i < count; i++)
120 items[i] = rhs.items[i];
124 int IntArray::Sum(
int start,
int end)
const 128 for (
int i = start; i <= end; i++)
134 double IntArray::dSum(
int start,
int end)
const 138 for (
int i = start; i <= end; i++)
144 int IntArray::Max(
int start,
int end)
const 146 if (start >= count)
return 0;
148 int result = items[start];
150 for (
int i = start + 1; i <= end; i++)
151 if (result < items[i])
157 int IntArray::Min(
int start,
int end)
const 159 if (start >= count)
return 0;
161 int result = items[start];
163 for (
int i = start + 1; i <= end; i++)
164 if (result > items[i])
170 int IntArray::Find(
int value)
const 172 for (
int i = 0; i < count; i++)
173 if (value == items[i])
178 int IntArray::BinarySearch(
int value)
const 181 int stop = count - 1;
183 while (start <= stop)
185 int mid = (start + stop) / 2;
187 if (items[mid] == value)
190 if (items[mid] > value)
199 void IntArray::Zero()
201 for (
int i = 0; i < count; i++)
205 int IntArray::Compare(
int * a,
int * b)
210 void IntArray::Sort()
212 QuickSort(items, count,
sizeof(
int), COMPAREFUNC Compare);
215 void IntArray::Sort(
IntArray & freeRider)
217 QuickSort2(items, freeRider.items, count,
sizeof(
int), COMPAREFUNC Compare);
221 void IntArray::Reverse()
223 for (
int i = 0, j = count - 1; i < j; i++, j--)
227 int IntArray::CountIfGreater(
int threshold)
const 231 for (
int i = 0; i < count; i++)
232 if (items[i] > threshold)
238 int IntArray::CountIfGreaterOrEqual(
int treshold)
const 242 for (
int i = 0; i < count; i++)
243 if (items[i] >= treshold)
249 void IntArray::Add(
int term)
251 for (
int i = 0; i < count; i++)
255 void IntArray::Multiply(
int factor)
257 for (
int i = 0; i < count; i++)
261 void IntArray::Divide(
int denominator)
263 for (
int i = 0; i < count; i++)
264 items[i] /= denominator;
267 void IntArray::Stack(
const IntArray & a)
271 Dimension(count + a.count);
273 for (
int i = 0; i < a.count; i++)
274 items[i + end] = a[i];
277 bool IntArray::operator == (
const IntArray & rhs)
const 279 if (count != rhs.count)
282 for (
int i = 0; i < rhs.count; i++)
283 if (items[i] != rhs.items[i])
289 bool IntArray::operator != (
const IntArray & rhs)
const 291 return !(*
this == rhs);
297 bool IntArray::isAscending()
299 for (
int i = 1; i < count; i++)
300 if (items[i] < items[i - 1])
305 bool IntArray::isDescending()
307 for (
int i = 1; i < count; i++)
308 if (items[i] > items[i - 1])
313 void IntArray::Add(
const IntArray & v)
315 if (Length() != v.Length())
316 error(
"IntArray::Add - vectors have different lengths\n" 317 "IntArrays - Left[%d] += Right[%d] ",
318 Length(), v.Length());
320 for (
int i = 0; i < Length(); i++)
324 int IntArray::InnerProduct(
IntArray & v)
326 if (Length() != v.Length())
327 error(
"IntArray::InnerProduct - vectors have different dimensions\n" 328 "IntArrays - Left[%d] * Right[%d] ",
329 Length(), v.Length());
332 for (
int i = 0; i < Length(); i++)
333 sum += items[i] * v[i];
340 int * temp = rhs.items;
344 int swap = rhs.count;
353 void IntArray::Print(FILE * output)
355 Print(output,
"Array of Integers");
358 void IntArray::Print(FILE * output,
const char * label)
360 fprintf(output,
"%s [%d elements]: ", label, count);
362 for (
int i = 0; i < count; i++)
363 fprintf(output,
"%d ", items[i]);
365 fprintf(output,
"\n");
368 void IntArray::PushIfNew(
int value)
370 for (
int i = 0; i < count; i++)
371 if (items[i] == value)
377 int IntArray::Product()
381 for (
int i = 0; i < count; i++)
387 double IntArray::DoubleProduct()
389 double product = 1.0;
391 for (
int i = 0; i < count; i++)
397 int IntArray::Hash(
int initval)
399 return hash((
unsigned char *) items,
sizeof(
int) * count, initval);
402 int IntArray::SumProduct(
const IntArray & weight)
const 404 if (count != weight.count)
405 error(
"IntArray::SumProduct called with different sized arrays\n");
408 for (
int i = 0; i < count; i++)
409 sum += items[i] * weight[i];
414 double IntArray::dSumProduct(
const IntArray & weight)
const 416 if (count != weight.count)
417 error(
"IntArray::dSumProduct called with different sized arrays\n");
420 for (
int i = 0; i < count; i++)
421 sum += items[i] * weight[i];