Вывод значения элемента массива в функции 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 );

Перейти на страницу:

Похожие книги