Вывод значения элемента массива в функции print() осуществляет такая инструкция:
os _ia[ ix ];
Для ее правильной работы должно выполняться требование к типам, которыми конкретизируется шаблон Array: такой тип должен быть встроенным либо иметь собственный оператор вывода. В противном случае любая попытка распечатать содержимое класса Array приведет к ошибке компиляции в том месте, где используется несуществующий оператор.
Функция-член grow() увеличивает размер объекта класса Array. В нашем примере - в полтора раза:
template class elemType
void Array elemType::grow()
{
elemType *oldia = _ia;
int oldSize = _size;
_size = oldSize + oldSize/2 + 1;
_ia = new elemType[_size];
int ix;
for ( ix = 0; ix oldSize; ++ix )
_ia[ix] = oldia[ix];
for ( ; ix _size; ++ix )
_ia[ix] = elemType();
delete[] oldia;
}
Функции-члены find(), min() и max() осуществляют последовательный поиск во внутреннем массиве _ia. Если бы массив был отсортирован, то, конечно, их можно было бы реализовать гораздо эффективнее.
template class elemType
elemType Array elemType ::min( )
{
assert( _ia != 0 );
elemType min_val = _ia[0];
for ( int ix = 1; ix _size; ++ix )
if ( _ia[ix] min_val )
min_val = _ia[ix];
return min_val;
}
template class elemType
elemType Array elemType ::max()
{
assert( _ia != 0 );
elemType max_val = _ia[0];
for ( int ix = 1; ix _size; ++ix )
if ( max_val _ia[ix] )
max_val = _ia[ix];
return max_val;
}
template class elemType
int Array elemType ::find( elemType val )
{
for ( int ix = 0; ix _size; ++ix )
if ( val == _ia[ix] )
return ix;
return -1;
}
В шаблоне класса Array есть функция-член sort(), реализованная с помощью алгоритма быстрой сортировки. Она очень похожа на шаблон функции, представленный в разделе 10.11. Функция-член swap() - вспомогательная утилита для sort(); она не является частью открытого интерфейса шаблона и потому помещена в закрытую секцию:
template class elemType
void Array elemType ::swap( int i, int j )
{
elemType tmp = _ia[i];
_ia[i] = _ia[j];
_ia[j] = tmp;
}
template class elemType
void Array elemType ::sort( int low, int high )
{
if ( low = high ) return;
int lo = low;
int hi = high + 1;
elemType elem = _ia[low];
for ( ;; ) {
while ( _ia[++lo] elem ) ;
while ( _ia[--hi] elem ) ;
if ( lo hi )
swap( lo,hi );
else break;
}
swap( low, hi );
sort( low, hi-1 );
sort( hi+1, high );
}
То, что код реализован, разумеется, не означает, что он работоспособен. try_array() - это шаблон функции, предназначенный для тестирования реализации шаблона Array:
#include "Array.h"
template class elemType
void try_array( Array elemType &iA )
{
cout "try_array: начальные значения массива\n";
cout iA endl;
elemType find_val = iA [ iA.size()-1 ];
iA[ iA.size()-1 ] = iA.min();
int mid = iA.size()/2;
iA[0] = iA.max();
iA[mid] = iA[0];
cout "try_array: после присваиваний\n";
cout iA endl;
ArrayelemType iA2 = iA;
iA2[mid/2] = iA2[mid];
cout "try_array: почленная инициализация\n";
cout iA endl;
iA = iA2;
cout "try_array: после почленного копирования\n";
cout iA endl;
iA.grow();
cout "try_array: после вызова grow\n";
cout iA endl;
int index = iA.find( find_val );