12. Стандартная библиотека шаблонов – STL
12. 1. Общая характеристика STL – Standard Template Library • Содержит подборку классов коллекций для различных целей • Поддерживает ряд алгоритмов для работы с этими коллекциями • Оформлена в виде шаблонов классов и функций 2
12. 2. Компоненты STL контейнер итера тор алгоритмы контейнер итератор контейнер ератор ит 3
12. 3. Распределители памяти Специальные объекты, занимающиеся выделением и освобождением памяти. Распределитель по умолчанию: namespace std { template <class T> class allocator; } Использует операторы new и delete 4
12. 4. Контейнерные классы Последовательные контейнеры – упорядоченные коллекции: вектор – vector дек – deque список – list 5
12. 4. Контейнерные классы (продолжение) Определение последовательных контейнеров: namespace std { template <class T, class Allocator = allocator<T> > class имя_контейнера; } 6
12. 4. Контейнерные классы (продолжение) Ассоциативные контейнеры – отсортированные коллекции: множество – set, multiset отображение – map, multimap 7
12. 4. Контейнерные классы (продолжение) Определение ассоциативных контейнеров: namespace std { template <class T, class Compare = less<T>, class Allocator = allocator<T> > class имя_множества; } 8
12. 4. Контейнерные классы (продолжение) namespace std { template <class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key, T> > > class имя_отображения; } Критерий сортировки (less<X>) – по умолчанию operator < 9
12. 5. Контейнерные адаптеры Специализированные виды контейнеров, предназначенные для особых целей: стеки очереди приоритетные очереди Критерий сортировки – по умолчанию operator < 10
12. 6. Использование контейнеров 1. Должны поддерживать семантику значений 2. Порядок размещения элементов в контейнере 3. Операции с контейнером небезопасны #include <имя_контейнера> 11
12. 7. Общие операции Конструкторы: пустой инициализирующие копирующий Деструктор Присваивание Сравнение: <, <=, ==, !=, > 12
12. 7. Общие операции (продолжение) Операции сравнения: – совпадение типов – критерий равенства – отношения «меньше/больше» 13
12. 7. Общие операции (продолжение) Методы класса Операция c. size() c. empty() c. max_size() c 1. swap(c 2) swap(c 1, c 2) Описание Возвращает фактическое количество элементов Проверяет, пуст ли контейнер (эквивалент c. size() == 0, но иногда выполняется быстрее) Возвращает максимально возможное количество элементов (значение зависит от реализации) Меняет местами содержимое с1 и с2 То же, но в форме глобальной функции 14
12. 7. Общие операции (продолжение) Методы класса Операция Описание c. insert(pos, el) Вставляет копию элемента el (с разными вариантами возвращаемого значения и интерпретацией первого аргумента) c. erase(beg, end) Удаляет все элементы из интервала [beg, end) (некоторые контейнеры возвращают следующий элемент после удаленного интервала) c. clear() Удаляет из контейнера все элементы (контейнер остается пустым) 15
12. 7. Общие операции (продолжение) Методы для итераторов Операция c. begin() c. end() c. rbegin() c. rend() Описание Возвращает итератор для первого элемента Возвращает итератор для позиции за последним элементом Возвращает обратный итератор для первого элемента при переборе в обратном направлении Возвращает обратный итератор для позиции за последним элементом при переборе в обратном направлении 16
12. 8. Итераторы Итератор – объект, предназначенный для последовательного перебора элементов Основные операторы Оператор Описание * Получение элемента в текущей позиции итератора ++ Перемещение итератора к следующему элементу == и != Проверка совпадения позиций, представленных двумя итераторами = Присваивание итератора (позиции элемента, на который он ссылается) 17
12. 8. Итераторы (продолжение) begin() pos end() Принцип использования: контенер col; контенер: : iterator pos; for(pos = col. begin(); pos != col. end; ++pos). . . *pos. . . 18
12. 8. Итераторы (продолжение) Типы итераторов • контейнер : : iterator • контейнер : : const_iterator 19
12. 9. Категории итераторов Итератор ввода Итератор вывода Прямой итератор Двунаправленный итератор Итератор произвольного доступа 20
12. 10. Пример контейнера: vector Обращение к элементам вектора Операция c. at(indx) c[indx] c. front() c. back() Описание Возвращает элемент с индексом indx (при недопустимом значении индекса – исключение out_of_range) Возвращает элемент с индексом indx (без проверки его существования) Возвращает первый элемент (без проверки его существования) Возвращает последний элемент (без проверки его существования) 21
12. 10. Пример контейнера: vector (продолжение) #include <iostream> #include <vector> using namespace std; int main() { vector<int> vec; int i; 22
12. 10. Пример контейнера: vector (продолжение) for(i = 10; i <= 60; i += 10) vec. push_back(i); for(i = 0; i < vec. size(); ++i) cout << vec[i] << ' '; cout << endl; 10 20 30 40 50 60 23
12. 10. Пример контейнера: vector (продолжение) vector<int>: : iterator pvec; for(pvec = vec. begin(); pvec != vec. end(); ++pvec) cout << *pvec << ' '; cout << endl; return 0; } 10 20 30 40 50 60 Для продолжения нажмите любую клавишу. . . 24
12. 11. Пример контейнера: list Обращение к элементам Операция c. front() c. back() Описание Возвращает первый элемент (без проверки его существования) Возвращает последний элемент (без проверки его существования) 25
12. 11. Пример контейнера: list (продолжение) Вставка и удаление элементов Операция c. push_back(elem) Описание Присоединяет копию elem в конец списка c. pop_back() Удаляет последний элемент (не возвращая его) c. push_front(elem) Вставляет копию elem в начало списка c. pop_front() Удаляет первый элемент (не возвращая его) 26
12. 11. Пример контейнера: list (продолжение) Функции врезки 27
12. 11. Пример контейнера: list (продолжение) Операция c 1. splice(pos, c 2) c 1. splice(pos, c 2 pos) Описание Перемещает все элементы с2 в с1 перед позицией итератора pos Перемещает все элементы с2, начиная с позиции итератора c 2 pos, в список с1 перед позицией итератора pos c. splice(pos, c 2, Перемещает все элементы интервала c 2 beg, c 2 end) [c 2 beg, c 2 end) списка с2 в список с1 перед позицией итератора pos (с1 и с2 могут совпадать) 28
12. 11. Пример контейнера: list (продолжение) Операция c. unique() c. sort() Описание Удаляет дубликаты Сортирует элемены (с использованием оператора <) c. reverse() Переставляет все элементы в обратном порядке c. merge(c 2) Перемещает все элементы с2 в с1 с сохранением сортировки (предполагается, что оба контейнера содержат отсортированные элементы) 29
12. 11. Пример контейнера: list (продолжение) #include <iostream> #include <list> using namespace std; int main() { list<int> lst 1, lst 2; for(int i = 10; i <= 60; i += 10){ lst 1. push_back(i); lst 2. push_front(i); } 30
12. 11. Пример контейнера: list (продолжение) list<int>: : iterator plst; cout << “Output 1. “; for(plst = lst 1. begin(); plst != lst 1. end(); ++plst) cout << *plst << ' '; cout << endl; Output 1. 10 20 30 40 50 60 31
12. 11. Пример контейнера: list (продолжение) cout << ”Output 2. ”; for(plst = lst 2. begin(); plst != lst 2. end(); ++plst) cout << *plst << ' '; cout << endl; Output 2. 60 50 40 30 20 10 32
12. 11. Пример контейнера: list (продолжение) lst 1. splice(lst 1. end(), lst 2. begin(), lst 2. end()); cout << “Output 3. “; for(plst = lst 1. begin(); plst != lst 1. end(); ++plst) cout << *plst << ' '; cout << endl; Output 3. 10 20 30 40 50 60 60 50 40 30 20 10 33
12. 11. Пример контейнера: list (продолжение) lst 1. sort(); cout << “Output 4. ”; for(plst = lst 1. begin(); plst != lst 1. end(); ++plst) cout << *plst << ' '; cout << endl; return 0; } Output 4. 10 10 20 20 30 30 40 40 50 50 60 60 Для продолжения нажмите любую клавишу. . . 34
12. Ассоциативный контейнер: set Вставка и удаление элементов Операция Описание c. insert(elem) Вставляет копию elem c. insert(beg, end) Вставляет копию всех элементов интервала [beg, end) c. erase(elem) Удаляет элементы со значением elem c. erase(pos) Удаляет элемент в позиции итератора pos c. erase(beg, end) Удаляет все элементы из интервала [beg, end) c. clear() Удаляет все элементы 35
12. Ассоциативный контейнер: set (продолжение) Поиск элемента: c. find(elem) – возвращает позицию итератора для первого элемента со значением elem (или end()) Представляется двоичным деревом 36
12. Ассоциативный контейнер: set (продолжение) #include <iostream> #include <set> using namespace std; int main() { set<int> col 1; 37
12. Ассоциативный контейнер: set (продолжение) col 1. insert(12); col 1. insert(5); col 1. insert(22); col 1. insert(15); col 1. insert(6); 38
12. Ассоциативный контейнер: set (продолжение) set<int>: : iterator pos 1; for(pos 1 = col 1. begin(); pos 1 != col 1. end(); ++pos 1) cout << *pos 1 << ' '; cout << endl; return 0; } 3 5 6 12 15 22 Для продолжения нажмите любую клавишу. . . 39
12. Ассоциативный контейнер: set (продолжение) #include <iostream> #include <set> using namespace std; template <class T> class My. Comp{ public: bool operator()(const T &t 1, const T &t 2) { return t 2 < t 1; } }; 40
12. Ассоциативный контейнер: set (продолжение) int main() { set<int, My. Cmp<int> > col 2; col 2. insert(12); col 2. insert(5); col 2. insert(22); col 2. insert(15); col 2. insert(6); col 2. insert(3); 41
12. Ассоциативный контейнер: set (продолжение) set<int, My. Comp<int> >: : iterator pos 2; for(pos 2 = col 2. begin(); pos 2 != col 2. end(); ++pos 2) cout << *pos 2 << ' '; cout << endl; return 0; } 22 15 12 6 5 3 Для продолжения нажмите любую клавишу. . . 42
12. 13. Алгоритмы Стандартные алгоритмы, предназначенные для обработки элементов коллекций: – поиск – сортировка – копирование – переупорядочение – модификация – численные расчеты 43
12. 13. Алгоритмы (продолжение) #include <algorithm> Используют: – интервал [beg, end) – сравнение на основе operator < 44
12. 13. Алгоритмы (продолжение) Примеры: Поиск max / min контейнер col; контейнер: : iterator pos; pos = min_element(col. begin(), col. end()); if(pos != col. end()) cout << *pos << endl; 45
12. 13. Алгоритмы (продолжение) Сортировка sort(col. begin(), col. end()); – итератор произвольного доступа Поиск значения в заданном интервале pos = find(col. begin(), col. end(), значение); if(pos != col. end()) cout << *pos << endl; 46
12. 13. Алгоритмы (продолжение) Изменение критерия для сравнения bool func(тип_элемента_контейнера op 1, тип_элемента_контейнера op 2); min_element(начало_интервала, конец_интервала, func); sort(начало_интервала, конец_интервала, func); 47
12. 13. Алгоритмы (продолжение) bool cmp(const string &s 1, const string &s 2) { return s 1. length() < s 2. length(); } 48
12. 13. Алгоритмы (продолжение) void print(const vector<string> &op); int main() { vector<string> lst; string s; cout << "Enter some words; enter "quit" to quit" << endl; 49
12. 13. Алгоритмы (продолжение) do { cin >> s; lst. push_back(s); } while(s != "quit"); cout << "Entered words: n"; print(lst); Enter some words; enter "quit" to quit qwe fd tre ghy uyt asdfr dsa ccccccccc quit Entered words: qwe fd tre ghy uyt asdfr dsa ccccccccc quit 50
12. 13. Алгоритмы (продолжение) cout << "Min word: " << (*min_element(lst. begin(), lst. end())) << endl; cout << "Word with min length: " << *min_element(lst. begin(), lst. end(), cmp) << endl; Min word: asdfr Word with min length: fd 51
12. 13. Алгоритмы (продолжение) sort(lst. begin(), lst. end()); cout << "Words, sorted by words: n"; print (lst); Words, sorted by words: asdfr ccccccccc dsa fd ghy quit qwe tre uyt 52
12. 13. Алгоритмы (продолжение) sort(lst. begin(), lst. end(), cmp); cout << "Words, sorted by length: n"; print(lst); return 0; } Words, sorted by length: fd dsa ghy qwe tre uyt quit asdfr ccccccccc Для продолжения нажмите любую клавишу. . . 53
12. 13. Алгоритмы (продолжение) void print(const vector<string> &op) { vector<string>: : const_iterator p; for(p = op. begin(); p != op. end(); ++p) cout << *p << " "; cout << endl; } 54