|
Программирование >> Инициализация объектов класса, структура
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(); она не
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |