    Простой пример демонстрирует, как использовать итераторы для просмотра по 
объектов в очереди. Как и в программе DIRECT.CPP, в листинге 16.3 набор строк 
запоминается косвенным образом, но на этот раз в контейнере класса TIQueueAsDoubleList. 

    Листинг 16.3.   ITERATE.CPP (демонстрация итераторов) 

    1:   «include <iostream.h> 
    2:   «include <cstring.h> 
    3:   «include <classlib\queues.h> 
    4: 
    5: // Объявление глобального косвенного строкового контейнера очереди
    6 TIQueueAsDoubleList<string> iQueue;	
    7: 
    8: int main()	
    9: {	
    10:	// Запомнить несколько строк в очереди                                 
    11:	iQueue.Put(new string("Line up")); 
    12:	iQueue.Put(new string("for the"));                                    
    13:	iQueue.Put(new string("Magical"));         
    14:	iQueue.Put(new string("Mystery"));   
    15:	iQueue.Put(new string("Tour"  ));                                      
    16:	
    17:	// Объявить косвенный строковый итератор для iQueue                    
    18:	TIQueueAsDoubleListIterator<string> iterator(iOueue); 
    19: 
    20:	// Применить итератор для сканирования по очереди 
    21:	cout « "\nWalk the queue using an iterator:" « endl; 
    22:	cout « "————————————————————" « endl; 
    ! 23:	while (iterator != 0) { 
    24:	   cout « «iterator.Current() « endl; 
    25:	   iterater++; 
    26:	} 
    27:	 
    28:	// Применить стандартный метод извлечения объектов из очереди          
    29:	cout « "\nExtract queue objects:" « endl;               
    30:	cout « "———————————————————" « endl; 
    31:	while ( !iQueue.IsEmpty() ) { 
    32:	   string *p = iQueue.Get();                                     
    33:	   cout « *p « endl; 
    34:	   delete p; 
    35:	}                                                                      
    36:	
    37:	return 0; 
    38:	}

    В качестве контейнера в программе объявляется глобальный объект с именем 
iQueue. Поскольку контейнер — косвенный (его имя начинается с TI), в нем 
запоминаются указатели на строковые объекты: 

    TIQueueAsOoubleList<string> iQueue;	

   Как я уже упоминал, обычно лучше всего пользоваться оператором создания 
динамических объектов new для запоминания их в косвенном контейнере. Для 
добавления нескольких строк в очередь программа передает указатели, 
возвращаемые оператором new, функции-члену Put() всех контейнеров очергдей. 
Функция PutO для очереди имеет такое же значение, как и функция AddO для массивов: 

    iQueue.Put(new string("Hagical")); 
    iQueue.Put(new string("Mystery")); 

    Затем в программе создается итератор класса, разработанный для совместного 
использования с классом TIQueueAsDoubleList. Для формирования имени класса 
добавьте в конце слово Iterator: 

    TIQueueAsDoubleListIterator<string> iterator(iQueue); 

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

    typedef TIQueueAsDoubleListIterator<string> Tlterator; 

    Директива typedef означает, что отныне TIterator — синоним предыдущего 
"кулдыкающего" словосочетания. Объявление контейнера теперь выглядит намного 
приятнее (и намного легче для чтения): 

    TIterator iterator(iQueue); 

    В любом случае, объявление создаст итератор (который я назвал iterator) 
типа TIQueueAsDoubleListIterator<string>. Передача объекта iQueue конструктору 
итератора связывает итератор с этим контейнером. Операции с использованием 
итератора будут выполняться над данными контейнера iQueue. 


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