
- •Учебное пособие
- •Введение
- •Объектно-ориентированный подход
- •Объектно-ориентированное программирование Абстрактные типы данных
- •Базовые принципы объектно-ориентированного программирования
- •Простейший ввод и вывод
- •Объект cout
- •Манипуляторы hex и oct
- •Другие манипуляторы
- •Объект cin
- •Операторы для динамического выделения и освобождения памяти (new и delete)
- •Базовые конструкции объектно-ориентированных программ Объекты
- •Понятие класса
- •Конструктор копирования
- •Конструктор explicit
- •Указатели на компоненты класса
- •Встроенные функции (спецификатор inline)
- •Организация внешнего доступа к локальным компонентам класса (спецификатор friend)
- •Вложенные классы
- •Static-члены (данные) класса
- •Указатель this
- •Компоненты-функции static и const
- •Proxi-классы
- •Параметры ссылки
- •Независимые ссылки
- •Практические приемы ограничения числа объектов класса
- •Наследование (производные классы)
- •Конструкторы и деструкторы при наследовании
- •Виртуальные функции
- •Абстрактные классы
- •Виртуальные деструкторы
- •Множественное наследование
- •Виртуальное наследование
- •Перегрузка функций
- •Перегрузка операторов
- •Перегрузка бинарного оператора
- •Перегрузка унарного оператора
- •Дружественная функция operator
- •Перегрузка оператора []
- •Перегрузка оператора ()
- •Перегрузка операторов new и delete
- •Преобразование типа
- •Явные преобразования типов
- •Преобразования типов, определенных в программе
- •Шаблоны Параметризированные классы
- •Передача в шаблон класса дополнительных параметров
- •Шаблоны функций
- •Совместное использование шаблонов и наследования
- •Шаблоны класса и friend
- •Некоторые примеры использования шаблона класса Реализация smart-указателя
- •Классы поддерживающие транзакции
- •Задание значений параметров класса по умолчанию
- •Пространства имен
- •Ключевое слово using как директива
- •Ключевое слово using как объявление
- •Псевдоним пространства имен
- •Организация ввода-вывода
- •Состояние потока
- •Строковые потоки
- •Организация работы с файлами
- •Организация файла последовательного доступа
- •Создание файла произвольного доступа
- •Основные функции классов ios, istream, ostream
- •Основы обработки исключительных ситуаций
- •Перенаправление исключительных ситуаций
- •Исключительная ситуация, генерируемая оператором new
- •Генерация исключений в конструкторах
- •Задание собственной функции завершения
- •Спецификации исключительных ситуаций
- •Задание собственного неожиданного обработчика
- •Иерархия исключений стандартной библиотеки
- •Стандартная библиотека шаблонов (stl) Общее понятие о контейнере
- •Общее понятие об итераторе
- •Категории итераторов
- •Основные итераторы
- •Вспомогательные итераторы
- •Операции с итераторами
- •Контейнерные классы Контейнеры последовательностей
- •Контейнер последовательностей vector
- •Контейнер последовательностей list
- •Контейнер последовательностей deque
- •Ассоциативные контейнеры
- •Ассоциативный контейнер multiset
- •Ассоциативный контейнер set
- •Ассоциативный контейнер multimap
- •Ассоциативный контейнер map
- •Адаптеры контейнеров
- •Адаптеры stack
- •Адаптеры queue
- •Адаптеры priority_queue
- •Пассивные и активные итераторы
- •Алгоритмы
- •Алгоритмы сортировки sort, partial_sort, sort_heap
- •Алгоритмы поиска find, find_if, find_end, binary_search
- •Алгоритмы fill, fill_n, generate и generate_n
- •Алгоритмы equal, mismatch и lexicographical_compare
- •Математические алгоритмы
- •Алгоритмы работы с множествами
- •Алгоритмы swap, iter_swap и swap_ranges
- •Алгоритмы copy, copy_backward, merge, unique и reverse
- •Примеры реализации контейнерных классов Связанные списки
- •Реализация односвязного списка
- •Реализация двусвязного списка
- •Реализация двоичного дерева
- •Литература
- •Вопросы по курсу ооп
- •220013, Минск, п.Бровки, 6.
Ассоциативные контейнеры
Ассоциативные контейнеры предназначены для обеспечения прямого доступа посредством использования ключей. В 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.