Программирование >>  Операторы преобразования типа 

1 ... 25 26 27 [ 28 ] 29 30 31 ... 239


внутреннюю древовидную структуру контейнера таким образом, что левый потомок любого элемента всегда меньше (в отношении используемого критерия сортировки) этого элемента, а правый потомок всегда больше. Присутствие дубликатов (элементов с одинаковыми значениями) в множествах не допускается, поэтому значение 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:

Вставка элементов в коллекцию



1 ... 25 26 27 [ 28 ] 29 30 31 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика