Лекция 29. Введение в STL (часть 4) Красс Александр Alexander.Krass@gmail.com СПбГУ ИТМО, 2009.

Презентация:



Advertisements
Похожие презентации
Лекция 26. Введение в STL (часть 3) Красс Александр СПбГУ ИТМО, 2009.
Advertisements

Стандартная библиотека шаблонов (STL) Контейнеры –структуры для хранения данных. Алгоритмы – шаблонные универсальные функции для обработки данных Итераторы.
Библиотека стандартных шаблонов (STL) ( Standard Template Library) набор согласованных обобщённых алгоритмов, контейнеров, средств доступа к их содержимому.
Д.з. на 7 апреля Язык С++1. Задача 1: * и *= для rational class rational { int num, den; public: rational(int num_=0, int den_=1) : num(num_), den(den_)
Использование STL. Преимущества STL увеличение скорости написания программ гарантированное отсутствие ошибок универсальность (независимость от типов данных)
Деревья и их представление в STL Презентацию подготовила Чиркова Ольга, 2 подгруппа, группа 271ПИ.
Базовые структуры данных. STL Заикин Олег Сергеевич zaikin.all24.org
Лекция 23. Шаблоны (часть 3) Красс Александр СПбГУ ИТМО, 2008.
Class Т определяет тип элементов, хранимых в векторе. class А определяет тип класса, отвечающего за распределение памяти для элементов вектора.
Коллекции классов Лекция 12. С помощью коллекций вместо создания структур данных программист использует готовые структуры данных, не заботясь об их реализации.
Лекция 21. Шаблоны (часть 1) Красс Александр СПбГУ ИТМО, 2008.
Д.з. 1Д.з. 1Числа в обратном порядке - 1 list l; // Вариант с list // Добавляем числа в обратном // порядке for (;;) { cin >> n; // Читаем числа if (n==0)
Абстрактный тип данных список. Операции над абстрактным списком Создать пустой список Уничтожить список Определить, пуст ли список Определить количество.
Лекция 25. Введение в STL (часть 2) Красс Александр СПбГУ ИТМО, 2009.
Лекция 22. Шаблоны (часть 2) Красс Александр СПбГУ ИТМО, 2008.
Реализация списков:динамические структуры ListList clasclas структура одного элемента type LIST = celltype; celltype = record element: eltype; next: LIST.
Прикладное программирование кафедра прикладной и компьютерной оптики Полиморфизм.
Лекция 13. Введение в ООП. Часть 4 Красс Александр СПбГУ ИТМО, 2008.
Лекция 10 ОбъектыЛекция 10 ОбъектыООП Инкапсуляция Возможность совместного хранения данных и кода для их обработки Наследование Возможность расширять существующие.
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Транксрипт:

Лекция 29. Введение в STL (часть 4) Красс Александр СПбГУ ИТМО, 2009

Темы priority_queue pair Ассоциативные контейнеры set multiset map multimap

priority_queue Очередь – последовательный контейнер, позволяющий добавлять элементы в конец и удалять их из начала Очередь с приоритетом – очередь в которой все элементы упорядочены в соответствии с неким приоритетом –Гарантируется что элемент на вершине очереди имеет наивысший приоритет

priority_queue (2) Находится в пространстве имен std Для его использования необходимо подключить файл queue Тип T должен или иметь оператор < или необходимо предоставлять предикат сравнения.

priority_queue (3) template,class Pred=less > class priority_queue { public: typedef Cont::value_type value_type; // Типы typedef Cont::size_type size_type; explicit priority_queue ( const Pred& pr = Pred() ); // Конструкторы template priority_queue (Iter first, Iter last, const Pred& pr = Pred()); bool empty() const; // Размеры size_type size () const; value_type& top(); // Работа с элементами const value_type& top() const; void push(const value_type& x); void pop(); protected: // Члены класса / реализация Cont c; Pred comp; };

priority_queue (4) Контейнер, на базе которого строится priority_queue должен определять следующие типы: 1.typedef... value_type; 2.typedef... size_type; И поддерживать следующие операции: 1. bool empty() const; 2.size_type size() const; 3. const value_type& front() const; 4.value_type& front(); 5. void push_back(const value_type& x); 6. void pop_back (); vector и deque этим требованиям полностью удовлетворяют.

priority_queue (5) Пример (красным цветом выделен результат операции top): priority_queue prq; prq.push(10); // 10 prq.push(1); // 10, 1 prq.push(7); // 10, 1, 7 prq.push(20); // 10, 1, 7, 20 prq.push(30); // 10, 1, 7, 20, 30 prq.push(0); // 10, 1, 7, 20, 30, 0 prq.pop(); // 10, 1, 7, 20, 0 prq.pop(); // 10, 1, 7, 0 prq.pop(); // 1, 7, 0 prq.pop(); // 1, 0 prq.pop(); // 0

pair Предоставляет обобщенную структуру из двух полей. Находится в пространстве имен std Для его использования вне map, set и пр. необходимо подключить файл utility. Объявление выглядит так: template struct pair { typedef T first_type; typedef U second_type; T first; U second; pair(); pair(const T& x, const U& y); template pair(const pair & pr); }; Есть вспомогательная функция, упрощающая создание экземпляров: template pair make_pair(const T& x,const U& y); Активно используется в классах set, multiset, map, multimap.

Ассоциативные контейнеры Основные характеристики: –Контейнеры переменного размера –Доступ к элементу по ключу произвольного типа –Поддерживает удаление и добавление элементов (по ключу) –Элементы упорядочены по ключу в соответствии с заданным критерием сортировки –Не поддерживается вставка элемента в произвольное место

Ассоциативные контейнеры (2) Общая структура: –Все АК определяют тип value_type в качестве типа своих элементов –Кроме того, каждый элемент в АК имеет ключ с типов key_type

Ассоциативные контейнеры (3) Реализация –АК обычно реализуются в виде сбалансированного бинарного дерева –Пара (Key, Value) сохраняется в дереве в соответствии с порядком сортировки Key Следствие –После добавления элемента в контейнер его ключ изменить нельзя! –АК не имеют изменяемых итераторов, выражение *I = v не поддерживается

Ассоциативные контейнеры (4) Классификация: –Простые АК – set, multiset –Составные АК – map, multimap Другая классификация: –Уникальные АК – set, map –Множественные АК – multiset, multimap

Ассоциативные контейнеры (5) Простые АК: –Элементы это и есть ключи –Типы value_type и key_type это по сути одно и тоже –Элементы в простых АК не изменяемы. –const_iterator это тоже самое что и просто iterator. Составные АК –Элементы состоят из пары key, value –Value изменяемо, Key нет. –const_iterator и iterator это разные типы

Ассоциативные контейнеры (6) Уникальные АК –Каждый элемент хранится в единственном экземпляре Множественные АК –Допускает хранение нескольких элементов с одним ключом

set Простой, уникальный АК Реализует понятие множества Находится в пространстве имен std Для его использования достаточно включить файл set Упрощенное определение: template < class Key, class Pred = less, class Alloc = allocator > class set { }; Key – тип элементов, хранящихся в множестве Pred – предикат сравнения элементов. По умолчанию, оператор < Alloc – определяет стратегию распределения памяти

set -типы set определяет следующие типы: // Для доступа к элементам typedef Key key_type; typedef Key value_type; // Переопределение предикатов typedef Pred key_compare; typedef Pred value_compare; // Определения итераторов и пр. typedef... allocator_type, size_type, difference_type, reference, const_reference, iterator, const_iterator,... Т.е., set определяет такой же набор типов как и остальные контейнеры.

set - конструкторы Set определяет следующие конструкторы: set ( const Pred& comp = Pred(), const Alloc& al = Alloc() ) – конструктор по умолчанию set ( const set& x ) – конструктор копирования template set( Iter first, Iter last, const Pred& comp = Pred(),const A& al = A()) – интервальный конструктор, позволяющий скопировать в множество интервал из любого контейнера Пример: std::list l; // заполнили l std::set s(l.begin(), l.end()); for (std::set ::const_iterator it = s.begin(); it != s.end(); it++) std::cout << *it; // в результате на экран выведутся только уникальные элементы списка l.

set - вставка Класс set содержит операцию вставки элемента в множество: pair insert(const value_type& x); Проверяет, существует ли элемент x в множестве. Элемент x равен y если !key_compare()(x,y) &&!key_compare()(y,x). Если не существует, то добавляет его в множество Получает итератор для этого элемента (или добавленного или существующего) Возвращает make_pair если элемент был создан, и make_pair если он уже существовал

set – вставка (2) Помимо обычного insert, set поддерживает еще две версии этой функции: –iterator insert(iterator it,const value_type& x) – вставляет элемент x в множество, используя it как подсказку, куда вставлять. Если подсказка не верна, используется обычный алгоритм. –template void insert(Iter first, Iter last) – вставляет все элементы из интервала [first; last)

set – вставка (3) Пример:

set - удаление set поддерживает операцию удаления элемента по ключу, итератору, а также группу элементов из заданного интервала: –size_type erase ( const Key& key ) – удаляет элемент по ключу. Возвращает кол'ичество удаленных элементов. (Для set это или 0 или 1) –void erase ( iterator it) – удаляет элемент, заданный итератором –void erase ( iterator first,iterator last ) – удаляет диапазон элементов [first; last)

set – удаление (2) Пример:

set - поиск set поддерживает операцию поиска элемента по ключу. const_iterator find (const Key& key) const – возвращает итератор, соответствующий переданному ключу. Пример:

multiset Простой, Множественный АК (несколько элементов multiset могут иметь одно и тоже значение) Находится в пространстве имен std Для его использования достаточно подключить файл set Поддерживает те же операции, что и set –insert возвращает не pair, просто iterator

multiset – доп. операции multiset реализует дополнительные операции: lower_bound, upper_bound, equal_range const_iterator lower_bound ( const Key& key ) const – возвращает итератор для первого элемента x, такого что key_compare()(x,key) = false. Если такого элемента нет, возвращает end() const_iterator upper_bound ( const Key& key ) const - – возвращает итератор для первого элемента x, такого что key_compare()(x,key) = true. Если такого элемента нет, возвращает end() pair equal_range(const Key& key) const – возвращает пару итераторов x и y, такую что: 1. x == lower_bound(key) 2. y == upper_bound(key)

multiset – доп. операции (2) Пример:

map Составной, уникальный АК, хранящий пару элементов pair. Первый элемент пары это ключ поиска, второй это значение Поддерживает эффективные операции удаления, вставки и поиска ПО КЛЮЧУ. При вставке элементов все итераторы остаются валидным. При удалении, все кроме удаляемого. Внутри map хранит свое содержимое в упорядоченном виде. Порядок задается ключом. Ключ каждого элемента обязан быть уникальным.

map - пример Пример – библиотечный каталог Каталог позволяет по ID книги получать информацию о том, где она лежит. Местоположение книги задается структурой: struct Location { unsigned Room; unsigned Case; unsigned Shelf; }; Тогда весь каталог можно будет хранить в map: std::map catalogue;

map – реализация Как правило, при реализации map используются сбалансированные деревья

map - определение map находится в пространстве имен std. Для его использования достаточно подключить файл map. namespace std { template, typename Allocator = allocator > > class map { }; } Key – ключ, уникальный для каждого элемента T – значение, хранящееся вместе с ключом. Pred – предикат сравнения, определенный для Key. По умолчанию, std::less Allocator – локатор для управления памятью

map – создание и уничтожение map содержит следующие конструкторы и деструктор: 1. explicit map ( const Pred& comp = Pred() const Allocator& al = Alloc()) – конструктор по умолчанию. 2. map ( const map& x ) – конструктор копирования 3. template map ( Iter first, Iter last, const Pred& comp =Pred(), const Allocator& al = Alloc()) – конструктор, позволяющий заполнить map частью другого map-а или массивом пар pair 4.~map() – деструктор Пример: typedef map Data; pair a[3] = { make_pair( 20,1.5), make_pair(800,0.3), make_pair( 3,0.2) }; Data res1; // empty map Data res2(a,a+3); // map is initialized by array Data res3(res2); // use res2 for initialization

map – общие свойства map поддерживает оператор присваивания, методы begin и end, а также оператор []: iterator begin(); const_iterator begin() const; iterator end(); iterator end() const; map & operator= (const map & x); T& operator[] ( const key_type& x );

map – общие свойства (2) Пример (доступ через []): map res1, res2; res1[0] = res2[1]; res2[100] = 0.7; res2[101] = res2[100]+0.1; Пример (доступ через итераторы) template void traverse ( RESULTS& res ) { RESULTS::iterator i; for ( i = res.begin(); i != res.end(); i++ ) if ( (*i).first < 20 ) Application((*i).second); }

map - вставка map поддерживает вставку как через оператор [], так и через метод insert: pair insert ( const value_type& x ); iterator insert ( iterator position, const value_type& x); template void insert ( Iter first, Iter last ); Пример: map res; res[100] = 0.2; // Здесь элемента с ключом 100 еще нет. res[100] = 0.3; // А здесь он уже есть, поэтому новый не создается res.insert(make_pair(100,0.3)); // и здесь так же

map – удаление и поиск map поддерживает операции удаления и поиска по ключу: iterator erase ( iterator it ); iterator erase ( iterator first, iterator last ); size_type erase ( const Key& key ); iterator find ( const key_type& x ); const_iterator find ( const key_type& x)const; Пример: RESULTS res; // заполнили RESULTS::iterator i1 = res.find( 7); // i1 указывает на RESULTS::iterator i2 = res.find(11); // i2 указывает на res.end() RESULTS::iterator i3 = res.find(15); // i3 указывает на res.erase(i1); //удалили элемент res.erase(15); // удалили элемент // Итераторы i1 и i3 стали невалидными!!!

map и multimap map и multimap очень похожи: –Один заголовочный файл –Большинство операций совпадает Но есть и различие: –multimap позволяет хранить несколько элементов с одним ключом –Другое поведение операции insert –Оператор[] не используется для вставки. –Поддерживаются операции lower_bound, upper_bound, equal_range. (семантика такая-же, как и у multiset)

37 Спасибо за внимание Вопросы?