|
Программирование >> Операторы преобразования типа
В каждом контейнере определены два типа итераторов: О контейнер:Aterator - используется для перебора элементов в режиме чтения/записи; О KonmeUHepy.constJteratQT - используется для перебора элементов в режиме чтения. Скажем, в классе list эти определения выглядят примерно так: namespace std { template <cla5s Т> class list ( public: typedef ... Iterator: typedef ... const 1terator: Конкретный тип итераторов iterator и constjterator зависит от реализации. В теле цикла for итератор pos инициализируется позицией первого элемента: pos = coll.begInC); Цикл продолжается до тех пор, пока ров не выйдет за пределы интервала контейнерных элементов: pos != coll .endO : В этом условии итератор pos сравнивается с конечным итератором. Оператор ++POS в заголовке цикла перемещает итератор pos к следующему элементу. В итоге итератор pos перебирает все элементы, начиная с первого, пока не дойдет до конца (рис. 5.4). Если контейнер не содержит ни одного элемента, тело цикла не выполняется, потому что значение coll.begin() будет равным значению colI.endQ. Рис. 5.4. Итератор pos при переборе элементов списка В теле цикла текущий элемент представляется выражением *pos. Модификация текущего элемента невозможна, потому что итератор был объявлен с типом const iterator, а значит, с точки зрения итератора элементы являются константными. Но если объявить неконстантный итератор дляперебора неконстантных элементов, значения можно будет изменить. Пример: Приведение всех символов в списке к верхнему регистру list<char>::1terator pos: for (pos = coll-beglnC); pos != coll.endC): ++pos) { *pos = toupperC*pos): Обратите внимание на использование префиксной версии оператора ++. Возможно, в этом случае она работает эффективнее постфиксной версии, которая создает временный объект для возвращения старой позиции итератора. Из-за этого в общем случае рекомендуется использовать -(--(-pos вместо ро5++, а следующее решение нежелательно: for {pos = coll .begmc-): pos != coll.endC): pos++) { Работает, но медленнее По этой причине можно рекомендовать ограничиваться префиксными формами операторов увеличения и уменьшения. Примеры использования ассоциативных контейнеров Цикл, приведенный в предыдущем примере, может использоваться с любым типом контейнера - достаточно сменить тип итератора. Нилсе приведены примеры использования ассоциативных контейнеров. Примеры использования множеств и мультимножеств Первый пример показывает, как происходит вставка элементов в множество и их последующий вывод с использованием итератора: stl/setl,cpp Iinclude <iostreani> include <set> int nainO Тип коллекции typedef std::set<int> IntSet: IntSet coll: Контейнер для целых чисел Вставка элементов со значениями от 1 до 6 * - значение 1 вставляется дважды coll coll coll coll coll coll insertC3) insert CI) insertCS) insertC4) insertCl) insert(6) coll,1nsertC2): /* Вывод содержимого множества * - перебор всех элементов. */ IntSet::const iterator pos: for (pos coll.beginO; pos != coll.endO; ++pos) { std::cout *pos ; std::COut Std::endl: Как обычно, следующая директива гюдгружает все необходимые определения типов и операций с множествами: Iinclude <set> Тип контейнера используется в нескольких местах программы, поэтому для удобства мы определяем для него сокращенное название: typedef std::set<1nt> IntSet; Команда определяет тип IntSet как множество элементов типа int. Этот тип использует стандартный критерий сортировки, при котором элементы сортируются оператором < (то есть упорядочиваются по возрастанию). Чтобы отсортировать элементы по убыванию или использовать совершенно иной критерий сортировки, передайте его в качестве второго параметра шаблона. Например, следующая команда определяет тип множества с сортировкой элементов по убыванию: typedef set<int.greater<1nt> > IntSet: Стандартный объект функции greatero рассматривается на с. 140, критерий сортировки, использующий только часть данных объекта, - на с. 296. Все ассоциативные контейнеры поддерживают функцию insert(), которая вставляет новый элемент: coll.insertC3); coll.insertCl); Позиция нового элемента определяется автоматически в соответствии с критерием сортировки. Функции последовательных контейнеров push back() или push front() не поддерживаются ассоциативными контейнерами. В данном случае эти функции не имеют смысла, поскольку позиция нового элемента определяется автоматически. Состояние контейнера после вставки элементов в произвольном порядке иллюстрирует рис. 5.5. В результате сортировки элементы объединяются во Обратите внимание на пробел между символами >. Последовательность > воспринимается компилятором как оператор сдвета, что приводит к синтаксической ошибке.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |