Программирование >>  Инициализация объектов класса, структура 

1 ... 275 276 277 [ 278 ] 279 280 281 ... 395


template <class elemType> ostream&

operator<<( ostream &os, Array<elemType> &ar )

return ar.print( os );

template <class elemType>

ostream & Array<elemType>::print( ostream &os ) const

const int lineLength = 12;

os << ( << size << )< ; for ( int ix = 0; ix < size;

ix < size; ++ix )

if ( ix % lineLength == 0 && ix )

os << \n\t ; os << ia[ ix ];

не водить запятую за последним элементом в строке, а также за последним элементом массива if ( ix % lineLength != lineLength-1 && ix != size-1 )

os << , ;

os << >\n ;

return os;

Вывод значения элемента массива в функции 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() и miax() осуществляют последовательный поиск во внутреннем массиве 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;

бы реализовать гораздо эффективнее.



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:

В шаблоне класса Array есть функция-член sort() , реализованная с помощью алгоритма быстрой сортировки. Она очень похожа на шаблон функции, представленный в разделе 10.11. Функция-член swap() - вспомогательная утилита для sort(); она не



1 ... 275 276 277 [ 278 ] 279 280 281 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика