Глава 19. Классы-шаблоны 519

h05191.jpg

1 // IGREAT.CPP — Перегрузка шаблонов

2 ttinclude <string.h>

3 #include <iostream.h>

4 // Для трассировки внутри функции удалите спецификатор inline.

5 template <class T> .

6 inline int IsGreater(Т &а, Т& h)

7 ( return a > Ь ? 1 : 0; ) .

8 // Специальная версия для строк char* (ASCIIZ)

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

10 ( return strcmpf a, b) > 0 ? 1 : 0; }

11 void main()

12 ( • ""•'-' '• - • ' •

13 char *strl = "STRING1";

14 char *str2 = "STRING2";

15 int а = 1, b =2; •

16 cout «"IsGreater( 1, 2) " « IsGreater( a, b) « endl;

17 cout « "IsGreater( str2, strl)" « IsGreaterf str2, strl) tЪ« endl; •

18 }

Функция шаблон, начинающаяся со строки 5, и перегруженная функция для строк char*, начинающаяся со строки 9, показывают, что как общая, так и специальная реализация функции могут сосуществовать в одном пространстве имен (обратите внимание на то, что в строке 9 использовано упрощенное объявление функции). Итак, хотя инструментарий шаблонов позволяет создавать родовые функции, не забывайте проверять и при необходимости корректировать версии для всех используемых типов данных.

Родовые алгоритмы сортировки

Общеизвестно: чем сложнее алгоритм, тем труднее его реализация и выше вероятность появления ошибок. Например, алгоритмы сжатия изображений, навигации по структурам данных и сортировки попадают именно в эту категорию.

В данной главе мы рассмотрим реализации нескольких общеизвестных алгоритмов сортировки случайных данных, которые вы можете при желании встраивать в свои программы. Это три стандартных алгоритма: простейшая пузырьковая сортировка (bubble sort), сортировка методом выбора (selection sort) и быстрая сортировка (quick sort). Все алгоритмы реализованы как шаблоны. Определения включены в заголовочные файлы, тексты — в файлы с расширением .срр; также приведено несколько вариантов функций перестановки и несколько испытательных стендов, демонстрирующих порядок использования этих алгоритмов.