
- •Учебное пособие
- •Введение
- •Объектно-ориентированный подход
- •Объектно-ориентированное программирование Абстрактные типы данных
- •Базовые принципы объектно-ориентированного программирования
- •Простейший ввод и вывод
- •Объект 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.
Ассоциативный контейнер 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.