528 __ __ __ ___Часть III. Современное программирование на C++
Для параметризованного размера класса VECTOR можно задать значение по умолчанию
template <class Т, unsigned long SIZE = 100>
тогда можно будет обойтись указанием только типа класса в качестве первого параметра (что не запрещает указывать также и оба аргумента). Значения по умолчанию для параметризованных типов по назначению совершенно аналогичны аргументам по умолчанию для функций. Полный листинг этого класса (включая стенд для отладки) приведен в файлах vector.h и vector.cpp (листинг 19.5). Чтобы не отрываться от реальности, все функции-члены в'этом листинге переделаны из встраиваемых в традиционные.
Класс-шаблон для стека
Стек является сравнительно незамысловатой структурой; его можно построить на основе класса-шаблона для вектора. Стек может быть реализован и как список (с помощью указателей), и как массив. У обеих реализации есть свои преимущества и свои недостатки. Массив проще сортировать, доступ к данным по индексу гораздо быстрее, чем поиск в списке; с другой стороны, использование указателей обеспечивает большую гибкость в управлении памятью и упрощает добавление и удаление элементов.
Стеки удобны как средство протоколирования упорядоченной серии событий. Так, системный стек используется для хранения состояний регистров перед вызовом функций; в программах стековые структуры могут служить для сохранения и восстановления состояний различных объектов. Стек организован по принципу LIFO, он растет, когда на его вершину кладется элемент и сокращается при удалении элемента с вершины.
В листинге 19.6 демонстрируется реализация стека, производного (см. главу 20) от класса VECTOR, рассмотренного в последнем разделе. Объявление класса-шаблона VECTOR приведено в листинге 19.5.
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: |
); |