    22:	  cout « "TRUE" « endl;   
    23:	else               
    24:	  cout « "FALSE" « endl;	
    25:		
    26:	// Запомнить несколько строковых объектов в контейнере	
    27:	cp->Add(new string("Tip")); 
    28:	cp->Add(new string("Toe")); 
    29:	cp->Add(new string ("Through"));	
    30:	cp->Add(new string("The"));	
    31:	cp->Add(&s); // ! ! ! Опасность! ! ! Смотри комментарий 
    32:	ShowMe("Original array: ", *cp);	
    33: 
    34:	// Удалить объект из контейнера и уничтожить по индексу 
    35:	cp->Detach(2, TShouldOelete::Delete);  
    36:	ShowMe("After Detach(2, Delete)", *cp);  
    37: 
    38:	// Удалить объект из контейнера, НЕ удаляя его при этом   
    39:	cp->Detach(&s, TShouldDelete::NoDelete);           
    40:	ShowMe("After Detach(&s, NoDelete)", *cp); 
    41: 
    42:	// Удалить последний объект и, возможно, уничтожить его	
    43:	int n = cp->GetItemsInContainer();	
    44:	cp->Detach(n - 1, TShouldDelete::DefDelete);	
    45:	ShowMe("After Detactj(n - 1, DefDelete)", *cp);	
    46: 
    47:	// Удалить все объекты из контейнера, и, возможно, уничтожить их 
    48:	Cp->Flush(); 
    49:	ShowMe( "After Flush()", *cp);	
    50:		
    51:	// Удалить контейнер. НЕ удалять объекты???	
    52:	delete cp; 
    53:		
    54:	return 0;     
    55:	}             
    56: 
    57:	// Отображает содержимое контейнера сг, переданного по ссылке 
    58:	void ShowMe(const char *msg, TContainer &cr) 
    59:	{ 
    60:	TIterator iterator(cr); // Создать итератор для контейнера 
    61:	string *sp;          // Указатель на объекты контейнера 
    62: 
    63:	cout « endl « msg « endl;         // Отобразить сообщение 
    64:	cout « "Items in container = ";       // Отобразить сообщение	
    65:	cout « cr.6etItemsInContainer() « endl; // Отобразить число элементов 
    66:	while ((sp = iterator++) != 0)       // Цикл по итератору 
    67:	  cout « " " « *sp;              // Отобразить элементы	
    68:	cout « endl;                   // Перевести строку 
    69:	}
 
    Для сокращения чрезмерно длинных объявлений в программе определяются два 
алиаса типов. Тип TContainer определяется как косвенный массив строк, 
реализованный с помощью вектора. Тип TIterator — итератор для этого 
контейнера. В программе объявляется указатель на тип TContainer, и с помощью 
оператора new создается объект контейнера:	

    TContainer «cp; 
    cp = new TContainer(10,  0,  10);	

    После отображения сообщения о том, владеет ли контейнер, адресуемый 
указателем ср, своими объектами (по умолчанию владеет), в контейнере 
запоминается несколько строковых объектов с помощью следующих операторов:	

    cp->Add(new string("Tip")); 

    Обратите внимание, что так же передается адрес временного строкового 
объекта s, размещающегося в системном стеке:	

    cp->Add(&s);    // !!!	

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


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