Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lucik_op.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
2.88 Mб
Скачать

Ассоциативный контейнер set

Контейнерный класс set используется для обеспечения быстрого сохранения и доступа к уникальным ключам. При попытке поместить в контейнер set дубликата ключа это действие игнорируется без идентификации ошибки. Контейнер set поддерживает двунаправленные итераторы. Работа с контейнером set может быть продемонстрирована на предыдущем примере, если в нем строку

typedef std::multiset<int,std::less<int> > intMSET;

заменить на строку

typedef set<int,std::less<int> > intMSET;

что приведет далее к созданию и работе с объектами класса set.

Ассоциативный контейнер multimap

Ассоциативный контейнер multimap эффективен для быстрого сохранения и нахождения ключей и ассоциированных с ними значений. Многие методы, используемые в контейнерах set и multiset, применимы к контейнерам map и multimap.

Элементами multimap и map являются объекты pair - пары ключей и соответствующих им значений. Порядок сортировки ключей в контейнере определяется компараторным объектом-функцией less<тип>. В контейнере multimap допускается дублирование ключей. Это означает, что несколько значений могут быть ассоциированы с одним ключом (отношение ”один ко многим”). Например, ученик изучает много предметов, один человек может иметь несколько банковских счетов и т.д.

Контейнер multimap поддерживает двунаправленные итераторы. Для работы с контейнерным классом multimap необходимо подключить заголовочный файл <map>. Рассмотрим пример использования контейнера multimap.

#include <iostream>

using std::cout;

using std::endl;

#include <map>

#include <algorithm>

typedef float T1; // тип ключа

typedef float T2; // тип элемента

typedef std::multimap<T1,T2,std::less<T1> > MUL_MAP;

T1 key;

main()

{ MUL_MAP mmap,mm;

MUL_MAP::const_iterator itr;

MUL_MAP::value_type pr; // элемент типа pair

key=3.1;

cout<<"пар с ключом "<<key<<" в multimap " << mmap.count(key)<<

" раз"<<endl;

mmap.insert(MUL_MAP::value_type(key,1.1));

mmap.insert(MUL_MAP::value_type(key,2.2));

cout<<"пар с ключом "<<key<<" в multimap " << mmap.count(key)<<

" раз"<<endl;

mmap.insert(MUL_MAP::value_type(5,12));

mmap.insert(MUL_MAP::value_type(1,20.12));

mmap.insert(MUL_MAP::value_type(12,20.12));

mmap.erase(5);

cout<<" размер multimap = "<<mmap.size()<<endl;

for(itr=mmap.begin();itr!=mmap.end();itr++)

cout<<itr->first<<'\t'<<itr->second<<'\n';

cout<<"нижняя граница "<<key<<'\t'<<(mmap.lower_bound(key)->first);

cout<<"верхняя граница "<<key<<'\t'<<(mmap.upper_bound(key)->first);

itr=mmap.find(key);

cout<<'\n' ;

if(itr!=mmap.end())

cout<<"найдено значение "<<itr->second<<”\tпо ключу ”

<<itr->first<<endl;

else cout<<"не найден ключ "<<key<<'\n';

mmap.clear();

return 0;

}

Результат работы программы:

пар с ключом 3.1 в multimap 0 раз

пар с ключом 3.1 в multimap 0 раз

размер multimap = 4

1 20.12

3.1 1.1

3.1 2.2

12 20.12

нижняя граница 3.1 3.1

верхняя граница 3.1 12

найдено значение 1.1 по ключу 3.1

В приведенном выше тексте программы в строках:

typedef float T1;

typedef float T2;

typedef std::multimap<T1,T2,std::less<T1> > MUL_MAP;

используя typedef, типам float и double назначаются псевдонимы T1 и T2 и экземпляру шаблонного класса multimap псевдоним MUL_MAP.

Компонента-функция mmap.count(key) возвращает число пар ключа key, содержащихся в multimap. Далее следуют функции insert для ввода пар ключей и соответствующих значений в контейнер.

mmap.insert(MUL_MAP::value_type(5,12));

В этой инструкции используется функция value_type(5,12), создающая объект pair, в котором first – это ключ (5) типа T1, а second – значение (12) типа T2.

В цикле for выводится содержимое контейнерного класса multimap (ключи и значения). Для доступа к компонентам pair элементов контейнера используется const_iterator itr. При этом ключи выводятся в порядке возрастания.

for(itr=mmap.begin();itr!=mmap.end();itr++)

cout<<itr->first<<'\t'<<itr->second<<'\n';

Для вывода нижней и верхней границ ключа key в контейнере используются

cout<<"нижняя граница "<<key<<'\t'<<(mmap.lower_bound(key)->first);

cout<<"верхняя граница "<<key<<'\t'<<(mmap.upper_bound(key)->first);

функции lower_bound() и upper_bound(), возвращающие итератор соответствующего элемента pair.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]