![]() |
|
Программирование >> Операторы преобразования типа
В каждом контейнере определены два типа итераторов: О контейнер: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.001
При копировании материалов приветствуются ссылки. |