Листинг 4.11. шаблоны функций
#include <iostream>
using namespace std;
//шаблон с идентификатором типа элементов массива arelem;
//и размера массива arsize;
template <class arelem, class arsize>
//тип размера не является шаблонным параметром;
arsize find (arelem ar[], arsize size, arelem & element)
{
//поиск позиции первого вхождения заданного элемента;
arsize ret_pos = -1;
for (long i = 0; i < size; i++)
if (ar[i] == element) {
ret_pos = i;
break;
}
return ret_pos;
}
int main(void)
{
long size;
cin >> size;
double *pinta = new double[size];
for (long i = 0; i < size; i++)
pinta[i] = i;
double value;
cin >> value;
cout << find(pinta, size, value) << endl;
delete[] pinta;
char* str = "string like array";
char ch;
cin >> ch;
cout << find(str, 17, ch) << endl;
return 0;
}
Шаблон предоставляет возможность функции иметь тип параметров или тип возвращаемого значения, не являющийся шаблонным параметром. Другой возможностью является явное задание типов, которое используется при невозможности автоматического вывода аргументов шаблона. Эти типы задаются в угловых скобках через запятую, при этом хвостовые параметры могут опускаться.
Листинг 4.12. Явное задание аргументов шаблона.
#include <iostream>
using namespace std;
template <class retype, class atype, class btype>
retype max (atype aval, btype bval)
{
return aval > bval ? aval : bval;
}
int main(void)
{
short x = 11;
float y = 11.3;
//первый аргумент – возвращаемый тип — double;
//оставшиеся выведутся автоматически;
cout << max<double>(x, y) << endl;
return 0;
}
4.5. Упражнения
Все функции, выполняющие нижеследующие задания должны быть выполнимы для различных встроенных числовых типов.
4.5.1. Простые функции
1. Разработать функцию, вычисляющую площадь прямоугольника
2. Разработать функцию, вычисляющую корни квадратного уравнения.
3. Разработать функцию, вычисляющую количество размещений без повторений.
4. Разработать функцию, определяющую, является ли число – степенью числа два.
5. Разработать функцию, вычисляющую площадь треугольника.
6. Разработать функцию, вычисляющую количество перестановок.
7. Разработать функцию, определяющую все делители числа.
8. Разработать функцию, вычисляющую площадь трапеции.
9. Разработать функцию, вычисляющую длину окружности.
10. Разработать функцию, вычисляющую количество сочетаний с повторениями.
11. Разработать функцию, определяющую наибольший общий делитель двух чисел.
12. Разработать функцию, определяющую является ли число простым.
13. Разработать функцию, вычисляющую количество сочетаний без повторений.
14. Разработать функцию, вычисляющую длину отрезка по координатам его точек.
15. Разработать функцию, выполняющую преобразование числа к числу в системе счисления с задаваемым значением базиса.
16. Разработать функцию, вычисляющую площадь круга.
17. Разработать функцию, определяющую координатные четверти, в которых лежит заданная коэффициентами гипербола.
18. Разработать функцию, определяющую наименьшее общее кратное двух чисел.
19. Разработать функцию, определяющую координатные четверти, в которых лежит заданная коэффициентами парабола.
20. Разработать функцию, вычисляющую количество размещений с повторениями.
4.5.2. Параметры – ссылки и параметры — указатели
1. Разработать функции, выполняющие задания из раздела «3.8.1. Статические и динамические массивы».
2. Разработать функции, выполняющие задания из раздела «3.8.2. Многомерные массивы».
5. Стандартные классы
5.1. Класс «pair»
Данный класс представляет из себя пару значений. Он определен в заголовочном файле «utility».
Доступ к значениям осуществляется через «first» и «second». Оба элемента пары могут иметь любой тип данных. При создании пары возможно сразу указать первоначальные значения. Создание пары возможно также посредством функции «make_pair()», которой в качестве параметров должны быть переданы значения элементов.
Над парами определены операции сравнения, выполняющиеся поэлементно. Результат данных операций в большей степени зависит от первых элементов сравниваемых пар, чем от вторых. Такое поведение связано с реализацией сравнения при помощи логических операций «&&» и «||». При их использовании, в случае значения выражения, стоящего до знака операции и равного «false» или «true» соответственно, возвращается соответствующее значение, а вычисление выражения после знака операции не происходит. То есть в ряде случаев вторые элементы пар не сравниваются вовсе.
Листинг 5.1. Класс pair.
#include <iostream>
#include <utility>
#include <string>
using namespace std;
int main (void)
{
//создание двух пар с заданными значениями и без задания;
pair<int, string> showPair1(1, "Ivanov"), showPair2;
//создане пары функцией make_pair();
showPair2 = make_pair(2, "Petrov");
if (showPair1 != showPair2) {
//создание пары копирующим конструктором;
pair<int, string> showPair3(showPair1);
cout << showPair3.first << ". " << showPair3.second << endl;
}
cout << (showPair1 > showPair2 ? showPair1 : showPair2).second << endl;
return 0;
}
5.2. Класс «complex»
Класс «complex» – класс комплексных чисел. Для его использования необходимо подключить файл «<complex>» .
Комплексное число состоит из действительной и мнимой частей: «real» и «imag». Обе части числа могут иметь любой из встроенных арифметических типов. Доступ к ним осуществляется через «real» и «imag» соответственно.
Над комплексными числами определены арифметические операции сложения, разности, умножения и деления, а также проверки на равенство и неравенство.
Комплексные числа могут вводиться и выводиться при помощи потоков. Вывод выглядит следующим образом: «(real, imag)». Ввод может осуществляться тремя способами: «real», «(real)», «(real,imag)». Допустимо также непосредственное присвоение комплексному числу значения одного из арифметических типов.
Над комплексными числами могут, помимо стандартных математических, выполняться операции в полярной системе координат: «abs()», «arg()», «polar()», «norm()».