|
Программирование >> Операторы преобразования типа
внутреннюю древовидную структуру контейнера таким образом, что левый потомок любого элемента всегда меньше (в отношении используемого критерия сортировки) этого элемента, а правый потомок всегда больше. Присутствие дубликатов (элементов с одинаковыми значениями) в множествах не допускается, поэтому значение 1 встречается в контейнере только один раз. Рис. 5.5. Множество из шести элементов Вывод элементов контейнера производится в цикле, знакомом по предыдущим примерам. Итератор последовательно перебирает элементы контейнера и выводит их значения: IntSet::con5t 1terator pos; for (pos = coll.beg1n(); pos != coll.endO; ++pos) { std: icout *pos ; Так как итератор определяется самим контейнером, он справляется со своей задачей, хотя структура контейнера становится более сложной. Например, если итератор ссылается на третий элемент, то оператор ++ переместит его к четвертому (верхнему) элементу. После следующего вызова оператора ++ итератор будет ссылаться на пятый (нижний) элемент (рис. 5.6), Рис. 5.6. Перебор элементов множества с помощью итератора pos Результат работы программы выглядит так: 12 3 4 5 6 Чтобы вместо обычного множества использовалось мультимножество, достаточно изменить тип контейнера (заголовочный файл остается тем же): typedef [nultiset<int> IntSet; Мультимножество допускает присутствие дубликатов, поэтому контейнер будет содержать два элемента со значением 1. Таким образом, выходные датнше программы будут выглядеть так: 1 1 2 3 4 5 6 Примеры использования отображений и мультиотображений Элементами отображений и мультиотображений являются пары ключ/значение , поэтому синтаксис объявления, вставки и обрап(ения к элементам несколько изменяется. Пример использования мультиотображения: stl/mmapl.cpp #inc1ude <iQstream> #include <map> #include <str1ng> using namespace std: int mainO Тип коллекции typedef multimap<1nt,string> IntStnngMMap: IntStringMMap coll: Контейнер для хранения nap int/string Вставка элементов в произвольном порядке - эначение с ключом 1 вставляется дважды. г(5. tagged )); гС2. а )): r(l. this )): coll.insert(make pa coll.insert(make pa coll.insert(rriake pa col 1. insert (rriake pai rC4. of )); coll.insert(make pairC6. strings )); coll.insert(make pair(l, is )): coll.insert(make pair(3. multimap )); /* Вывод содержимого контейнера * - перебор всех элементов * - переменная second содержит значение. */ IntStringMMap::iterator pos: for Cpos = coll.beginC); pos != coU.endO; ++pos) { cout pQS->second : cout endl: Результат работы программы может выглядеть так: this is а multimap of tagged strings Однако из-за совпадения ключей this - и is эти слова также могут быть выведены в противоположном порядке. Сравнивая этот пример с приведенным на с. 99, можно заметить два основных различия. О Элементы представляют собой пары ключ/значение , поэтому для вставки элемента в коллекцию необходимо создать объект pair. Задача решается с помощью вспомогательной функции make pair(). Дополнрттельная информация вместе с описанием других способов вставки приводится иа с. 209. О Итератор ссылается на пару ключ/значение , поэтому мы не можем просто направить его в выходной поток данных. Вместо этого приходится работать с отдельными членами структуры pair, которым присвоены имена first и second (тип pair представлен на с. 50). Следовательно, выражение pos->second определяет второй компонент пары ключ/значение , то есть значение элемента мультиотображения. Как и в случае с обычными указателями, это выражение представляет собой сокрангенную запись для (*pos).second. Аналогичное выражение pos->first определяет первый компонент пары ключ/ значение ; в нашем примере это ключ элемента мультиотображения. Мультиотображения также могут использоваться в качестве словарей. Пример приведен на с. 215. Отображение как ассоциативный массив Если в Предыдущем примере заменить multimap на тар, программа выведет те же данные без дубликатов (значения могут быть теми же). С другой стороны, набор пар ключ/значение с уникальными ключами также можно рассматривать как ассоциативный массив. Рассмотрим следующий пример: stl/mapl.cpp Iinclude <1ostream> Iinclude <map> Iinclude <string> using namespace std: int main() { /* Тип контейнера: * - map: элементами являются лары ключ/значение * - string: ключи относятся к типу string * - float: значения относятся к типу float */ typedef map<string.float> StrlngFloatMap; StringFloatMap coll: Вставка элементов в коллекцию
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |