522____________________Часть III. Современное программирование на C++

6: template <class T>

7: inline void Swap( T& a, T& b)( Т t = a; a = b; b = t; }

8: template <class T>

9: inline int IsGreater( T & a, T & b) { return a > b ? 1:0; }

10 // Перегруженная версия сравнения для данных типа char*

11 inline int IsGreater( char* a, char* b)

12 ( return strcmp( a, b) > 0 ? 1 : 0; }

13 template <class T>

14 void GumSort( T data[], unsigned long elem);

15 template <class T>

16 void SelectionSort( T data[], unsigned long elem);

17 // Эта функция при больших наборах данных может переполнить стек

18 // template <class T>

19 // void RecursiveQuickSort(T data[], unsigned long left, ^unsigned long right) ;

20 #endif

Заметьте, что объявления функций в строках 14 и 16 модифицированы (относительно предыдущего раздела): функции принимают "аргумент типа unsigned long, обозначающий число элементов в массиве. Причина проста:

разрабатывая предыдущую функцию, мы не задумывались над тем, как макрос SIZEOF будет обрабатывать массивы строк. Он не может правильно определить размер строки ASCIIZ. (Это еще одна иллюстрация разрыва между теорией и практикой).

Обратимся к листингу 19.4. Функция RecursiveQuickSort пока не будет использована (к ней мы вернемся в следующем разделе). В качестве функции сравнения возьмем функцию-шаблон isGreater, а в тестовой программе введем еще один очень простой класс TIMER.

h05221.jpg

1

// SORTS.CPP — Определения и испытательный стенд

2

#include "sorts.h"

3

template <class T>

4

void GumSort( T data[], unsigned long elem)

5

{

6

for( unsigned long j=0; j<elem-l; j++)

7

for( unsigned long k=j+l; k<elem; k++)

8

if( IsGreater( data[j], data[k]))

9

Swapf data[j], data[k]>;

10

}

11

template <class T>

12

void SelectionSort( T data[], unsigned long elem)

13

{

14

unsigned long swapAt;

15

for( unsigned long j=0; j<elem-l; j++)