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, а заканчивается закрывающей фигурной скобкой, следующей за


<< назад вперед >>