    Другой модификатор типа класса, Imp, означает реализацию. В общем, классы, 
имена которых заканчиваются на Imp, — это фундаментальные структуры данных, 
используемые для реализации абстрактных контейнеров. Например, класс 
TDoubleListlmp реализует двусвязный список. Вы можете использовать классы Imp 
для создания своих собственных, контейнеров, однако для этого необходимо 
хорошо разбираться во внутренностях классов. В большинстве случаев лучше 
пользоваться абстрактным контейнером, подобным TDequeAsDoubleList, чем 
реализацией TDoubleListlmp, на которой основывается абстрактный контейнер. 
    Третий и последний тип модификатора, Iterator, означает, что класс 
снабжает средствами итерации фундаментальную структуру или контейнер с похожим 
именем. Итератор обеспечивает доступ ко всем объектам, содержащимся в 
контейнере. Например, класс TDequeAsVectorlterator — итератор для объектов, 
хранящихся в контейнере TDequeAsVector. Классы итераторов, заканчивающиеся на 
Imp, снабжают средствами итерации фундаментальные структуры. Например, класс 
TDoubleListlteratorlmp — реализация итератора для объектов, хранящихся в 
структуре TDoubleListlmp. 
    Наконец, существует еще один класс, TShouldDelete, "плавающий" под своим 
флагом. Как можно заключить из его имени, этот специальный класс сообщает, 
должен ли контейнер удалять объекты, которые он хранит, или следует переложить 
эту обязанность на вас. Изучите раздел "Принадлежность объектов" в этой главе 
для того, чтобы узнать больше об этом классе.	

    Развитие "сознания" класса 

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

    Косвенное и непосредственное запоминание объектов в контейнерах 

    Независимо от типа контейнера, важно решить, запоминать ли объекты 
косвенно (по указателю) или непосредственно (копированием). Контейнеры, у 
которых в имени содержится буква I, подобные TIQueueAsVector, запоминают 
объекты косвенно, в виде указателей на них. Контейнеры без I (TQueueAsVector, 
например) запоминают непосредственно сами объекты. В листинге 16.2 
демонстрируется использование контейнеров обоих видов. 

    Листинг 16.2.  DIRECT.CPP (контейнеры с непосредственным и косвенным запоминанием) 

     1:	#include <iostream.h>                                           
     2:	#include <cstring.h>                                              
     3:	#include <classlib\arrays. h> 
     4:	
     5:	#define TRUE 1 
     6:	#define FALSE 0 
     7: 
     8: 	// Контейнеры с непосредственным и косвенным запоминанием объектов   
     9:	TArrayAsVector<string> dStrings(10);                           
    10:	TIArrayAsVector<string> iStrings(10); 
    11:	
    12:	int main() 
    13:	{ 
    14:	int done = FALSE; // Управляющая переменная цикла while 
    15:	int i;         // Управляющая переменная цикла for 
    16:	string s;        // Объект вводимой строки 
    17:	char buf[81];    // Символьный буфер ввода 
    18: 
    19:	while (!done) { 
    20:	  cout « "Enter a string: ";   // Приглашение ввода строки 
    21:	  cin.getline(buf, sizeof(buf)); // Записать в буфер 
    22:	  s = buf;               // Преобразовать в объект string 
    23:	  if (s.length() == 0)       // Проверить длину на нуль 
    24:	    done = TRUE;           // Если да - завершить цикл while 
    25:	  else {                 // ...ина^е. 
    26:	   dStrings.Add(s);   "     // Добавить в контейнер 
    21:	   iStrings.Add (new string(s)); // Добавить в косвенный контейнер 
    28:	} 
    29:	} 
    30: 
    31:	// Отобразить объекты контейнера с непосредственным запоминанием 
    32:	cout << endl;. 
    33:	cout << "Direct string array" << endl;                
    

    430	Часть IV. Разработка приложений 
