528 __ __ __ ___Часть III. Современное программирование на C++

Для параметризованного размера класса VECTOR можно задать значение по умолчанию

template <class Т, unsigned long SIZE = 100>

тогда можно будет обойтись указанием только типа класса в качестве первого параметра (что не запрещает указывать также и оба аргумента). Значения по умолчанию для параметризованных типов по назначению совершенно аналогичны аргументам по умолчанию для функций. Полный листинг этого класса (включая стенд для отладки) приведен в файлах vector.h и vector.cpp (листинг 19.5). Чтобы не отрываться от реальности, все функции-члены в'этом листинге переделаны из встраиваемых в традиционные.

Класс-шаблон для стека

Стек является сравнительно незамысловатой структурой; его можно построить на основе класса-шаблона для вектора. Стек может быть реализован и как список (с помощью указателей), и как массив. У обеих реализации есть свои преимущества и свои недостатки. Массив проще сортировать, доступ к данным по индексу гораздо быстрее, чем поиск в списке; с другой стороны, использование указателей обеспечивает большую гибкость в управлении памятью и упрощает добавление и удаление элементов.

Стеки удобны как средство протоколирования упорядоченной серии событий. Так, системный стек используется для хранения состояний регистров перед вызовом функций; в программах стековые структуры могут служить для сохранения и восстановления состояний различных объектов. Стек организован по принципу LIFO, он растет, когда на его вершину кладется элемент и сокращается при удалении элемента с вершины.

В листинге 19.6 демонстрируется реализация стека, производного (см. главу 20) от класса VECTOR, рассмотренного в последнем разделе. Объявление класса-шаблона VECTOR приведено в листинге 19.5.

h05281.jpg

1

// VECTOR.H — определение класса-шаблона вектора (или массива).

2

ftifndefVECTORH

3

#defineVECTORJ-i

4

template <class T, unsigned long SIZE = 100>

5

class VECTOR

6

{

7

public:

8

// Конструктор

9

VECTOR() ;

10:

T& operator[]( unsigned long j);

11:

private:

12:

T data[SIZE +1];

13:

);