    В табл.  16.3 имена АДТ и ФСД, приведенные в табл. 16.1 и 16.2, дополняются 
несколькими модификаторами способа хранения. Модификаторы задаются сразу 
после лидирующей буквы Т в имени класса. Например TlStackVector означает косвенный 
контейнерный класс стека, реализованный с помощью вектора. Косвенные контейнеры 
хранят указатели на объекты. Без модификатора I (например, в TStackVector) контейнер
запоминает непосредственно объекты данных. Добавочное S означает автоматическую 
сортировку. Например, кжасс TSArrayAsVector — отсортированный массив объектов, 
реализованный с помощью вектора, класс TШSArrayAsVector — отсортированный 
массив указателей на объекты, реализованный с помощью вектора. 

    Таблица 16.3. Модификаторы способов хранения	.   ;. 

    Модификатор	           СВОЙСТВО 

    С	С подсчетом числа объектов 
    I	С запоминанием указателей (без I  запоминаются сами объекты) 
    IS	С сортировкой и запоминанием указателей 
    М	С управлением памятью 
    MC	С управлением памятью и подсчетом числа объектов 
    Ml	С управлением памятью и запоминанием указателей 
    MIC	С управлением памятью, запоминанием указателей и подсчетом числа объектов 
    MIS	С управлением памятью, запоминанием указателей и сортировкой 
    MS	С управлением памятью и сортировкой 
    S	С сортировкой 

    В классах с модификатором М обеспечивается управление памятью для классов 
со схожими именами. (Я называю их контейнерами класса М, возможно, потому, 
что насмотрелся повторных показов фильма Star Trek). Например, в классе 
TMQueueAsVector обеспечивается управление памятью для класса TQueueAsVector. 
Единственная причина использования контейнера класса М — замена 
стандартного управления памятью вашим собственным. Большинство программистов 
крайне редко занимаются подобными вещами. 
    Контейнеры класса М используют класс выделения памяти по умолчанию 
TStandardAllocator, определенный в заголовочном файле ALLOCSTR.H. Этот класс 
пользуется базовыми операторами new, new[], delete и delete[], которые в 
Borland C++ вызывают стандартные функции языка С malloc() и free(). Если вы 
хотите реализовать свой класс выделения памяти, создайте класс с такими же 
функциями-членами, как в TStandardAllocator, и реализуйте в них выделение и 
освобождение памяти по своему усмотрению. 
    Например, вы можете зарезервировать блок памяти в начале программы и 
использовать ваш собственный класс выделения памяти для размещения 
контейнерных объектов внутри этого блока (см. листинг PERSIST. CPP и 
комментарии к нему в главе 15, где демонстрируются несколько подходящих 
приемов). Это может гарантировать наличие свободного пространства для 
некоторых видов объектов, используемых, например, в процедурах обработки 
критических ошибок, для которых стандартный метод выделения памяти может 
быть непригоден. 

    ЗАМЕЧАНИЕ 

    Контейнеры с сортировкой должны иметь возможность сравнивать свои объекты. 
Контейнеры с хранением непосредственно объектов должны быть способны их 
копировать. Любители напустить туман сказали бы: "Объекты должны иметь 
содержательную семантику копирования и сравнения". Это означает, что вы должны 
снабдить класс конструктором копии и перегруженными операторами == и <. Если 
вы в растерянности, перечитайте часть III. 

    После беглого ознакомления с библиотекой контейнеров рассмотрим несколько 
дополнительных классов, завершающихся одним из трех возможных суффиксов (я 
называю их модификаторами типа класса, однако стандартного термина для них не 
существует). Классы, имена которых заканчиваются словом Element, обеспечивают 
"списочные оболочки" объектов. Существует только два таких класса — 
TMDoubleListElement и TMListElement. Они дают возможность создавать списки 
объектов, не имеющих полей-указателей. Вы не мо жете использовать классы 
Element в контейнерах абстрактных типов данных. Они используются только 
фунддаментальными структурами данных.


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