STL для начинающих
1.1. Шаблоны, пространства имен и тип bool
Как легко догадаться из названия, стандартная библиотека шаблонов (STL) основывается на относительно новом понятии шаблона. Поэтому мы начнем с краткого обсуждения этого предмета.
Шаблонные функции
Предположим, что для некоторого положительного числа .г нам приходится часто вычислять значение выражения
2 * х + (х * х + 1) / (2 * х)
где х может быть типа double или int. В последнем случае оператор деления / обозначает целочисленное деление, дающее целый результат. Например, если х имеет тип double и равен 5.0, тогда значение приведенного выражения составляет 12.6, но если х имеет тип int и равен 5, то значение выражения будет 12. Вместо того чтобы писать две функции, такие как
double f(double x) { double x2 = 2 * х;
return x2 + (х * х + 1)/х2; }
int f(int x)
{ int х2 = 2 * х;
return х2 + (х * х + 1)/х2; }
нам достаточно создать один шаблон, как показано в следующем примере, который представляет собой законченную программу:
// ftempi.срр: Шаблонная функция. #include <iostream.h>
template <class T>
T f(T x)
{ Т х2 = 2 * х;
return х2 + (х * х + 1)/х2; }
int main()
{ cout « f(5.0) << endl « f(5) « endl;
return 0; }
Программа выведет
12.6 12
В этом шаблоне Т - тип, задаваемый аргументом при вызове/. При вызове /(5.0) Т будет обозначать double (это тип константы 5.0), так что, к примеру, в выражении (х * х + \)/х2 выполнится деление с плавающей точкой. Напротив, при исполнении вызова/(5) Т будет обозначать тип int, что приведет к целочисленному делению.
При разборе программы ftem.pl.cpp компилятор создает две различные функции, весьма похожие на функции f(double) nf(int), с которых мы начинали наш пример. Следовательно, компилятор должен одновременно «видеть» как определения, так и вызовы шаблонов. Это делает шаблоны плохими кандидатами на раздельную компиляцию; вместо этого мы, как правило, помещаем шаблоны в файлы заголовка. Когда мы используем файлы заголовка, написанные кем-то другим, мы не видим определения шаблонов и вызываем их как обычные функции, что показано на примере вызовов /(5.0) и/(5) в нашей программе. Поэтому, применяя шаблоны функций STL, мы можем и не знать, что вызываем функции, созданные из шаблонов.
Что в имени?
Шаблон, который, подобно рассмотренному выше, начинается со слова template, а заканчивается закрывающей фигурной скобкой, следующей за
<< назад вперед >>