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

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

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

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

Ассоциативный контейнер multiset обеспечивает быстрое сохранение и выборку ключей. Упорядочение элементов контейнера определяется компараторным объектом-функцией less<тип>, при этом отсортированные ключи должны поддерживать сравнение с помощью operator<, иначе (для пользовательских типов) необходимо перегружать операцию сравнения.

Класс multiset поддерживает двунаправленные итераторы (но не итераторы произвольного доступа).

#include <iostream>

using std::cout;

using std::endl;

#include <set>

#include <algorithm>

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

#define size 10

main()

{ int mas[]={2,4,1,6,19,17,1,7,17,14};

intMSET mset;

std::ostream_iterator<int> out(cout," ");

intMSET::const_iterator res;

cout<<"элемент 8 содержится в multiset " << mset.count(8)<<" раз\n";

mset.insert(8); //

mset.insert(8);

cout<<"содержимое multiset :";

std::copy(mset.begin(),mset.end(),out);

res=mset.find(6);

cout<<'\n' ;

if(res!=mset.end())

cout<<"найдено значение 6\n";

else cout<<"не найдено значение 6\n";

mset.insert(mas,mas+sizeof(mas)/sizeof(int)); //

cout<<"содержимое multiset :" ;

std::copy(mset.begin(),mset.end(),out);

cout<<"\nнижняя граница числа 17 " << *(mset.lower_bound(17));

cout<<"\nверхняя граница числа 17 " << *(mset.upper_bound(17));

std::pair<intMSET::const_iterator, intMSET::const_iterator> pr;

pr=mset.equal_range(17);

cout<<"\nнижняя граница числа 17 " << *(pr.first);

cout<<"\nверхняя граница числа 17 " << *(pr.second);

return 0;

}

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

элемент 8 содержится в multiset 0 раз

содержимое multiset : 8 8

не найдено значение 6

содержимое multiset : 1 1 2 4 6 7 8 8 14 17 17 19

нижняя граница числа 17 17

верхняя граница числа 17 19

нижняя граница числа 17 17

верхняя граница числа 17 19

В приведенной программе использованы следующие компоненты контейнерного класса multiset:

mset.count(8) – функция, доступная во всех ассоциативных контейнерах, возвращает число вхождений значения 8 в multiset. Затем в программе использованы две из трех версий функции insert:

mset.insert(8);

mset.insert(mas,mas+sizeof(mas)/sizeof(int));

первая из двух функций insert вставляет значение 8 во множество, а вторая - числа из интервала.

Далее используются функции lower_bound(17) и upper_bound(17) (доступные во всех ассоциативных контейнерах) для определения позиции первого вхождения числа 17 во множество и позиции элемента после последнего вхождения. Обе функции возвращают iterator или const_iterator соответствующих позиций, или итератор, возвращаемый функцией end.

В строке

std::pair<intMSET::const_iterator, intMSET::const_iterator> pr;

создается объект класса pair. Объекты класса pair используются для связывания пар значений. Объект pr используется для сохранения в нем значения pair, возвращаемого функцией equal_range и содержащего результаты lower_bound() и upper_bound(). Тип pair содержит две открытые компоненты с именами first и second. Для доступа к lower_bound() и upper_bound используются pr.first и pr.second.

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