10.11. Пример шаблона функции
10.11. Пример шаблона функции
В этом разделе приводится пример, показывающий, как можно определять и использовать шаблоны функций. Здесь определяется шаблон sort(), который затем применяется для сортировки элементов массива. Сам массив представлен шаблоном класса Array (см. раздел 2.5). Таким образом, шаблоном sort() можно пользоваться для сортировки массивов элементов любого типа.
В главе 6 мы видели, что в стандартной библиотеке C++ определен контейнерный тип vector, который ведет себя во многом аналогично типу Array. В главе 12 рассматриваются обобщенные алгоритмы, способные манипулировать контейнерами, описанными в главе 6. Один из таких алгоритмов, sort(), служит для сортировки содержимого вектора. В этом разделе мы определим собственный “обобщенный алгоритм sort()” для манипулирования классом Array, упрощенной версии алгоритма из стандартной библиотеки C++.
Шаблон функции sort() для шаблона класса Array определен следующим образом:
template class elemType
void sort( ArrayelemType array, int low, int high ) {
if ( low high ) {
int lo = low;
int hi = high + 1;
elemType elem = array[lo];
for (;;) {
while ( min( array[++lo], elem ) != elem lo high ) ;
while ( min( array[--hi], elem ) == elem hi low ) ;
if (lo hi)
swap( array, lo, hi );
else break;
}
swap( array, low, hi );
sort( array, low, hi-1 );
sort( array, hi+1, high );
}
}
В sort() используются две вспомогательные функции: min() и swap(). Обе они должны определяться как шаблоны, чтобы иметь возможность обрабатывать любые типы фактических аргументов, с которыми может быть конкретизирован шаблон sort(). min() определена как шаблон функции для поиска минимального из двух значений любого типа:
template class Type
Type min( Type a, Type b ) {
return a b ? a : b;
}
swap() – шаблон функции для перестановки двух элементов массива любого типа:
template class elemType
void swap( ArrayelemType array, int i, int j )
{
elemType tmp = array[ i ];
array[ i ] = array[ j ];
array[ j ] = tmp;
}
Убедиться в том, что функция sort() действительно работает, можно с помощью отображения содержимого массива после сортировки. Поскольку функция display() должна обрабатывать любой массив, конкретизированный из шаблона класса Array, ее тоже следует определить как шаблон:
#include iostream
template class elemType
void display( ArrayelemType array )
{ //формат отображения: 0 1 2 3 4 5
cout " ";
for ( int ix = 0; ix array.size(); ++ix )
cout array[ix] " ";
cout " ";
}
В этом примере мы пользуемся моделью компиляции с включением и помещаем шаблоны всех функций в заголовочный файл Array.h вслед за объявлением шаблона класса Array.
Следующий шаг – написание функции для тестирования этих шаблонов. В sort() поочередно передаются массивы элементов типа double, типа int и массив строк. Вот текст программы:
#include iostream
#include string
#include "Array.h"
double da[10] = {
26.7, 5.7, 37.7, 1.7, 61.7, 11.7, 59.7,
15.7, 48.7, 19.7 };
int ia[16] = {
503, 87, 512, 61, 908, 170, 897, 275, 653,
426, 154, 509, 612, 677, 765, 703 };
string sa[11] = {
"a", "heavy", "snow", "was", "falling", "when",
"they", "left", "the", "police", "station" };
int main() {
// вызвать конструктор для инициализации arrd
Arraydouble arrd( da, sizeof(da)/sizeof(da[0]) );
// вызвать конструктор для инициализации arri
Arrayint arri( ia, sizeof(ia)/sizeof(ia[0]) );
// вызвать конструктор для инициализации arrs
Arraystring arrs( sa, sizeof(sa)/sizeof(sa[0]) );
cout "sort array of doubles (size == "
arrd.size() ")" endl;
sort(arrd, 0, arrd.size()-1 );
display(arrd);
cout "sort array of ints (size == "
arri.size() ")" endl;
sort(arri, 0, arri.size()-1 );
display(arri);
cout "sort array of strings (size == "
arrs.size() ")" endl;
sort(arrs, 0, arrs.size()-1 );
display(arrs);
return 0;
}
Если скомпилировать и запустить программу, то она напечатает следующее (эти строки искусственно разбиты на небольшие части):
sort array of doubles (size == 10)
1.7 5.7 11.7 14.9 15.7 19.7 26.7
37.7 48.7 59.7 61.7
sort array of ints (size == 16)
61 87 154 170 275 426 503 509 512
612 653 677 703 765 897 908
sort array of strings (size == 11)
"a" "falling" "heavy" "left" "police" "snow"
"station" "the" "they" "was" "when"
В числе обобщенных алгоритмов, имеющихся в стандартной библиотеке C++ (и в главе 12), вы найдете также функции min() и swap(). В главе 12 мы покажем, как их использовать.
2013-04-30 02:53:36 Dia
спасибо большое
2011-11-15 22:03:22 Максим
далеко не легкая тема!
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Пример: использование функции фильтра
Пример: использование функции фильтра Программа 4.3 представляет собой каркас программы, иллюстрирующей обработку исключений и завершения выполнения, в которой используется функция фильтра. Программа предлагает пользователю указать тип исключения, после чего
Пример: параллельный поиск указанного текстового шаблона
Пример: параллельный поиск указанного текстового шаблона Настало время посмотреть на процессы Windows в действии. Приведенная ниже в качестве примера программа grepMP создает процессы для поиска указанного текстового шаблона в файлах, по одному процессу на каждый файл. Эта
Простой пример функции io_read()
Простой пример функции io_read() Чтобы проиллюстрировать, как ваш администратор ресурса мог бы возвращать клиенту данные, рассмотрим простейший администратор ресурса, который всегда возвращает одну и ту же строковую константу «Здравствуй, мир! ». Даже в таком простом случае
Простой пример функции io_write()
Простой пример функции io_write() Это был простой пример функции io_read(); давайте теперь перейдем к функции io_write(). Основной камень преткновения, связанный с io_write(), — получить доступ к данным. Поскольку библиотека администратора ресурсов считывает лишь незначительную часть
Простой пример функции io_devctl()
Простой пример функции io_devctl() Клиентский вызов devctl() формально определен так:#include <sys/types.h>#include <unistd.h>#include <devctl.h>int devctl(int fd, int dcmd, void *dev_data_ptr, size_t nbytes, int *dev_info_ptr);Прежде чем рассматривать эту функцию с позиций администратора ресурсов, надо сначала понять, что это за
Пример функции io_devctl() , имеющей дело с данными
Пример функции io_devctl(), имеющей дело с данными В предыдущем примере io_devctl() мы подняли вопрос о том, как устанавливать произвольные значения частоты дискретизации, Очевидно, создание большого количества констант DCMD_AUDIO_SET_SAMPLE_RATE_* было бы не самым оптимальным решением — у
Блокировка локальных и удаленных сценариев WSH. Пример административного шаблона
Блокировка локальных и удаленных сценариев WSH. Пример административного шаблона Как уже было указано в табл. 4.2, за блокировку локальных и удаленных сценариев WSH отвечают соответственно параметры реестра Enabled и Remote: если Enabled равно "0", то на машине вообще нельзя выполнять
Простой пример использования функции select
Простой пример использования функции select Теперь мы переделаем код нашего получателя внеполосных данных и вместо сигнала SIGURG будем использовать функцию select. В листинге 24.3 показана принимающая программа.Листинг 24.3. Принимающая программа, в которой (ошибочно)
10.1. Определение шаблона функции
10.1. Определение шаблона функции Иногда может показаться, что сильно типизированный язык создает препятствия для реализации совсем простых функций. Например, хотя следующий алгоритм функции min() тривиален, сильная типизация требует, чтобы его разновидности были
10.2. Конкретизация шаблона функции
10.2. Конкретизация шаблона функции Шаблон функции описывает, как следует строить конкретные функции, если задано множество фактических типов или значений. Процесс конструирования называется конкретизацией шаблона. Выполняется он неявно, как побочный эффект вызова
Пример 17-8. Встроенные документы и функции
Пример 17-8. Встроенные документы и функции #!/bin/bash# here-function.shGetPersonalData (){ read firstname read lastname read address read city read state read zipcode} # Это немного напоминает интерактивную функцию, но...# Передать ввод в функцию.GetPersonalData <<RECORD001BozoBozeman2726 Nondescript Dr.BaltimoreMD21226RECORD001echoecho "$firstname $lastname"echo "$address"echo "$city,
Структура шаблона
Структура шаблона Помимо специального заголовка, для шаблона необходима структура. Создать структуру можно при помощи таблиц или тегов <div>. Далее мы опишем создание табличной версии структуры. Если в Dremweaver все еще активирован режим разметки (layout mode), закройте