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.
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++) |