    Enter double value (0.0 to quit)  9.9 
    Enter double value (0.0 to quit)  3,14159 
    Enter double value (0.0 to quit)  -88.55 
    Enter double value (0.0 to quit)  4.32 
    Enter double value {0.0 to quit)  6.9 
    Enter double value (0.0(to quit)  0 
    Numbexfof objects: 5 
    Top -of- stack: 6. 9 
    6.9 
    4 .32 
    -88.55 
    3.14159 
    9.9
 
    Рис. 16.1. Результат работы программы STACKED 

    Для определения, достигло ли число элементов стека максимума, указанного 
при инициализации, следует вызывать функцию IsFull(). Чтобы проверить, пуст ли 
стек, следует обратиться к функции IsEmpty(). Вы можете вызывать функцию 
IsFull() перед сохранением объекта в стеке следующим образом: 

    if  (ImyStack.IsFull()) 
       myStack.Push; 

    Переменная d имеет тип double. Она не обязательно должна быть объектом 
класса, порожденным из поставляемого базового класса, как это было необходимо 
в старой, основанной на использовании объектов, библиотеке. Поскольку все 
контейнеры новой библиотеки — шаблоны, они подстраиваются под любой тип данных, 
который вы захотите хранить. 
    Для извлечения значения следует обратиться к функции Рор(), которая удаляет 
один объект из стека. Функция Рор() возвращает объект, сохраненный в 
контейнере. Это может быть копия объекта или указатель на динамический объект, 
в зависимости от типа контейнера. Обычно следует вызывать функцию IsEmpty() для 
предотвращения попытки извлечь значение из пустого стека: 

    if  ( !myStack. IsEmpty() )	
       d = myStack.PopO; 

    Если вам необходимо только узнать значение, находящееся в верхушке стека, 
следует обратиться к функции Тор(), возвращающей копию последнего сохраненного 
объекта или указатель на него, при этом сам объект из стека не удаляется. 
Опять же, имеет смысл вызвать IsEmpty() для предотвращения обращения к пустому 
стеку, не имеющему "верхнего" объекта: 

    if ( !myStack.IsEmpty() ) 
       d = myStack.Top(); 

    Для определения числа объектов, хранящихся в стеке, следует обратиться к 
функции GetItemsInContainer(). Обращение к ней всегда безопасно: 

    int n = myStack.GetltemsInContainer();	

    Большинство контейнерных классов имеют функции с одинаковыми именами, 
такими, как GetltemsInContainer(). Изучив функции в одном контейнере, вы сразу 
же будете знать функции и в другом. Однако только стек имеет функции типа 
Push(), Рор() и Тор().	

    Соглашения именования шаблонов 

    Бессчетное количество имен классов в библиотеке поначалу может показаться 
ошеломляющим, и поскольку одни классы выводятся из других, то часто приходится 
читать информацию о нескольких классах для того, чтобы разобраться, что делает 
один из них. Например, в классе TStackAsVector определен только конструктор. В 
предке класса TMStackAsVector определяются другие функции, подобные PushO, 
Рор() и Тор(). Вам придется разобраться в обоих классах, чтобы понять, как 
работает TStackAsVector. 

    ЗАМЕЧАНИЕ 

    В классах с именами, начинающимися на ТМ, обеспечивается управление 
памятью для контейнера. Эти цклассы следует использовать только в том случае, 
если вы собираетесь реализовать свое собственное управление памятью, о чем 
речь пойдет позже. 
    Хорошее знание имен контейнерных классов поможет вам продраться сквозь 
дебри библиотечной документации. Еще более важно свободно владеть соглашениями 
именования классов. Имена контейнерных классов характеризуют их возможности и 
взаимосвязи. Сперва имена контейнерных классов могут показаться вам столь же 
непонятными, как слова песен панк-рока, однако разложите имя каждого класса на 
составные части и вы обнаружите, что все они составлены по единому плану. 


    Глава 16. Библиотека шаблонов классов Borland     427 
