Примеры использования ассоциативных контейнеров


Первый пример показывает, как происходит вставка элементов в множество и их последующий вывод с использованием итератора:

#include "stdafx.h"

#include <iostream>

#include <set>

 

int main()

{

// Тип коллекции

typedef std::set<int> IntSet;

IntSet coll; // Контейнер дпя целых чисел

// Вставка элементов со значениями от 1 до 6

/*-значение 1 вставляется дважды */

coll.insert(3);

coll.insert(1);

coll.insert(5);

coll.insert(4);

coll.insert(1);

coll.insert(6);

coll.insert(2);

/* Вывод содержимого множества

* - перебор всех элементов. */

IntSet::const_iterator pos;

for (pos = coll.begin(); pos != coll.end(); ++pos) std::cout<<*pos <<' ';

std::cout << std::endl;

}

Как обычно, следующая директива подгружает все необходимые определения типов и операций с множествами: #include <set>

Тип контейнера используется в нескольких местах программы, поэтому для удобства мы определяем для него сокращенное название: typedef std::set<int> IntSet;

Команда определяет тип IntSet как множество элементов типа int. Этот тип использует стандартный критерий сортировки, при котором элементы сортируются оператором < (то есть упорядочиваются по возрастанию). Чтобы отсортировать элементы по убыванию или использовать совершенно иной критерий сортировки, передайте его в качестве второго параметра шаблона.

Все ассоциативные контейнеры поддерживают функцию insert(), которая вставляет новый элемент:

coll.insert(3);

coll.insert(1);

Позиция нового элемента определяется автоматически в соответствии с критерием сортировки. Функции последовательных контейнеров push_back() или push_front() не поддерживаются ассоциативными контейнерами. В данном случае эти функции не имеют смысла, поскольку позиция нового элемента определяется автоматически.

Состояние контейнера после вставки элементов в произвольном порядке иллюстрирует рис. 9.5. В результате сортировки элементы объединяются во внутреннюю древовидную структуру контейнера таким образом, что «левый» потомок любого элемента всегда меньше (в отношении используемого критерия сортировки) этого элемента, а «правый» потомок всегда больше. Присутствие дубликатов (элементов с одинаковыми значениями) в множествах не допускается, поэтому значение 1 встречается в контейнере только один раз.

 

 

Рис. 9.5. Множество из шести элементов

Вывод элементов контейнера производится в цикле, знакомом по предыдущим примерам. Итератор последовательно перебирает элементы контейнера и выводит их значения:

IntSet::const_iterator pos;

for (pos = coll.begin(); pos != coll.end(); ++pos) std::cout << *pos <<' ';

Так как итератор определяется самим контейнером, он справляется со своей задачей, хотя структура контейнера становится более сложной. Например, если итератор ссылается на третий элемент, то оператор ++ переместит его к четвертому (верхнему) элементу. После следующего вызова оператора ++ итератор будет ссылаться на пятый (нижний) элемент (рис. 9.6).

 

Рис. 9.6. Перебор элементов множества с помощью итератора pos

Результат работы программы выглядит так: 1 2 3 4 5 6

Чтобы вместо обычного множества использовалось мультимножество, достаточно изменить тип контейнера (заголовочный файл остается тем же):

typedef std::multiset<int> IntSet;

Мультимножество допускает присутствие дубликатов, поэтому контейнер будет содержать два элемента со значением 1. Таким образом, выходные данные программы будут выглядеть так:

1 1 2 3 4 5 6

 



Дата добавления: 2020-12-11; просмотров: 382;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.