Главная » C++, C++ Builder » Итератор STL

0

Вторая важная часть этого примера программы — использование класса iterator (итератор). В строчках кода

list<string, allocator<string> >::iterator list_iterator; list_iterator = listStrings.begin();

мы определяем новый объект, называемый итератор, который ссылается на начало списка. В STL итератор — это способ пройтись по элементам списка, не меняя порядка, в котором они находятся в списке. Вы также можете иметь несколько итераторов, ссылающихся на один и тот же список и указывающих на разные позиции в списке. Например, я мог бы определить два итератора и ходить вперед и назад по списку одновременно, написав следующее:

list<string, allocator<string> >::

iterator forward_list_iterator; list<string, allocator<string> >::

iterator backward_list_iterator; forward_list_iterator = listStrings.begin(); backward_list_iterator = listStrings.end();

Для работы с итераторами вы можете использовать операторы ++ и —- для движения вперед и назад. Итераторы двигаются последовательно, так что нет прямого пути для движения из точки A в точку C, если на пути лежит точка B. Итераторы важны, так как они предоставляют способ манипулировать данными в списке (или другой структуре данных) без непосредственной работы

со структурой данных. Поэтому вы можете использовать итератор всюду, где хотите, даже не зная в действительности каким образом реализована внутренняя структура данных. Итераторы могут быть разных типов. Одни двигаются только вперед, другие только назад. Некоторые могут быть использованы только для чтения, в то время как другие — для изменения данных, с которыми они работают. В любом случае, однако, оператор ++ будет проходить по данным, двигаясь от первого элемента к последнему. Оператор —-будет двигаться назад по структуре данных, от последнего элемента к первому. Когда итератор «указывает» на текущий элемент данных, как в предыдущем примере с forward_list_iterator, то вы можете получить внутренний тип данных (в данном случае строка), используя оператор «*». Например:

forward_list_iterator = listStrings.begin(); string s = (*forward_list_iterator);

Если предположить, что в списке были элементы, то строка s будет иметь такое же значение, что и первая строка в списке. Так как оператор * возвращает сам объект, то вы можете напрямую работать с элементом списка, манипулируя объектом iterator:

(*iterator).c_str()

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

Первый Второй Третий Четвертый Пятый Шестой

Для проверки этой теории скомпилируйте программу, выбрав Build|Make в среде CBuilder. Откройте окно команд MS-DOS и запустите программу, набрав project1. Вы  должны  увидеть вывод, появляющийся в окне, и он должен выглядеть точно также, как мы только что показали в листинге.

Вот более-менее все, что можно сказать о списках и итераторах списков. Когда вам нужен список в вашем приложении, просто добавьте его в класс и вперед. Списки, наверное, лучше всего подходят для приложений, содержащих переменное количество данных, которые в основном последовательно просматривают эти данные и которым нужна возможность добавлять и удалять данные в любой позиции списка. Адресные книги и инвентарные системы — хороший пример типов приложений, построенных на списках.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии