stl_introduction.ppt
- Количество слайдов: 19
Стандартна бібліотека шаблонів Standard Template Library, STL 'You may call it "nonsense" if you like, ' she said, 'but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!‘ Lewis Carroll Through the Looking-Glass Література 1. Эккель Б. , Эллисон Ч. Философия С++, т. 2, гл 5. -"Питер", 2004. 2. Вандевурд Д. , Джосатисс Н. Шаблоны С++: справочник разработчика. М. : "Вильямс", 2003.
Контейнери С++ • абстракція контейнера • масив С++ як низькорівневий контейнер – – простота визначення швидкий доступ до елементів (оператор []) примітивна функціональність слабка надійність • STL-контейнери – параметризовані типи – просте визначення об'єктів у програмі – однакові прийоми використання за рахунок уніфікованих інтерфейсів – спеціалізація контейнерів – ". . . результат цілеспрямованого пошуку безкомпромісно ефективних загальних алгоритмів"
STL-контейнери – параметризовані типи • розробка ефективних контейнерів – мотивація включення параметризованих типів у синтаксис С++ – відмова від ієрархічних типів • надійність використання • гнучкість щодо реалізації • вплив способу використання на якість коду Приклад 1) vector<int> a(10); for(unsigned i=0; i<10; i++) a[i]=100; 2) vector<int> a(10, 100);
Архітектура бібліотеки Компоненти STL: • контейнери – структури для зберігання даних; • ітератори – засоби, які володіють методами для обходу контейнерів і доступу до даних; • алгоритми – глобальні функції для обробки даних; • об’єкти-функції – класи, в яких перевантажено оператор виклику функції; використання об’єктів подібне до виклику функції; • адаптери – модифікатори інтерфейсу компонент: – адаптери-контейнери – адаптери-ітератори – адаптери-функції
Особливості визначення контейнерів • Уніфікація контейнерних класів ( при невеликій їх кількості) – однакові назви внутрішніх типів • value_type, allocator_type, size_type • iterator, const_iterator, reverse_iterator const_reverse_iterator • reference, pointer – однакові назви методів (статичний поліморфізм+швидке освоєння) • front, back • assign, push_front, insert, clear • Наявність ітераторів – спеціалізованого інтерфейсу для застосування алгоритмів до даних контейнера як послідовності об'єктів, не вникаючи в конкретні деталі будови як контейнера, так і його елементів. • Функціональність низького рівня виокремлена в допоміжні класи реалізації, які можуть відрізнятися у різних реалізаціях бібліотеки • Спеціалізована функціональність представлена чіткою множиною методів
Види контейнерів • Контейнери-послідовності (sequence containers) у кожний поточний момент існує певний порядок слідування елементів у контейнері: – – елементами є безпосередньо об'єкти послідовний обхід всіх елементів контейнера передача підпослідовностей в алгоритми для обробки рекомендованим засобом для перебору елементів є ітератор, який і забезпечує потрібний напрямок переміщень в контейнері • Асоціативні контейнери (associative containers) – – елементами є пари ключ-об'єкт структура зберігання – бінарне дерево завжди відсортований контейнер за значенням ключа доступ за значенням ключа
Послідовні контейнери • Вектор vector • Рядок символів basic_string, спеціалізації – string для char – wstring для wchar_t • Список list • Дек (черга з двома кінцями) deque • Адаптери – стек stack – черга queue – черга з пріоритетами priority_queue
Асоціативні контейнери • • Відображення (асоціативний масив) map Мультивідображення multimap Множина set Мультимножина multiset Ключ: – набуває значення в межах будь-якого типу, який допускає впорядкування – у відображеннях значення ключа не може повторюватися – у мультивідображеннях можуть зберігатися пари з однаковими значеннями ключа Множини і мультимножини є частковими випадками відображення та мультивідображення, об’єктами зберігання в них є лише ключі.
Інтерфейсні типи послідовних контейнерів Ідентифікатор value_type Тип компонента Тип елемента як одиниці зберігання в контейнері allocator_type Тип менеджера пам’яті size_type Тип для представлення розміру елемента і кількості елементів у контейнері difference_type Тип для представлення різниці адрес елементів контейнера, які повернули два ітератори reference Посилання на елемент контейнера const_reference Посилання на елемент контейнера, яке не допускає його модифікації pointer Вказівник на елемент контейнера const_pointer Вказівник на елемент контейнера, який не допускає його модифікації
Ітераторні типи послідовних контейнерів Ідентифікатор iterator const_iterator reverse_iterator const_reverse_iterator Тип компонента Ітератор для перебору елементів контейнера, який не допускає їхньої зміни Ітератор для перебору елементів контейнера згідно порядку, зворотнього до звичайного Ітератор для перебору без модифікації елементів контейнера згідно порядку, зворотнього до звичайного
Конструктори послідовних контейнерів • К-тор пустого контейнера explicit container(const Alloc& =Alloc() ); • К-тор контейнера з n елементів типу value_type зі значенням за замовчуванням. explicit container(size_type n, const Alloc& =Alloc ()); • К-тор контейнера з n елементів типу value_type, які мають значення x. container(size_type n, const T& х, const Alloc& = Alloc()); К-тор контейнера, проініціалізованого значеннями елементів послідовності [first, last), заданої за допомогою ітераторів введення (в іншому контейнері відповідного типу або у вхідному потоці). • template<class Input. Iterator> container (Input. Iterator first, Input. Iterator last, const Alloc&= Alloc ());
Інші спецметоди послідовних контейнерів Конструктор копіювання, аргумент-контейнер повинен бути того ж типу container(const container<T, Alloc>&); Деструктор контейнера ~container(); Оператор присвоєння; контейнери повинні бути одного і того ж типу container< T, Alloc>& operator=( const container<T, Alloc >& );
Методи встановлення контейнерних ітераторів Mетод Тип ітератора iterator begin(); const_iterator begin()const; Ітератор, настроєний на перший елемент контейнера. iterator end(); const_iterator end()const; Ітератор зі значенням reverse_iterator rbegin(); const_reverse_iterator rbegin()const; Зворотній ітератор зі значенням past-the-end. reverse_iterator rend(); const_reverse_iterator rend() const; Зворотній ітератор, настроєний на перший елемент контейнера. past-the-end. qпо 2 варіанти перевантажених методів qконстантний метод використовується у випадках: • контейнер оголошений константним • ініціалізація константних ітераторів чи параметрів
Методи доступу до елементів контейнера Mетод Тип результату reference operator[](size_type n) ; const_reference operator[](size_type n)const; Доступ за індексом до елемента без перевірки виходу за межі діапазону контейнера. 1 reference at(size_type n); const_reference at(size_type n)const ; Доступ за індексом до елемента з перевіркою виходу за межі діапазону контейнера. 1 reference front(); const_reference front()const ; Доступ до першого елемента контейнера (==begin() ) reference back(); const_reference back()const ; Доступ до останнього елемента контейнера ( !=end() ) 1 Лише для векторів та деків.
Методи модифікації контейнерів 1 Mетод Дія методу template <typename Input. Iter> void assign(Input. Iter first, Input. Iter last); Присвоєння елементам вектора значень заданої послідовності; усі попередні значення елементів контейнера вилучаються void assign(size_type n, const T& x); Присвоєння n елементам вектора значення об’єкта x; усі попередні значення елементів контейнера вилучаються. void push_front(const T& x); Додавання нового елемента контейнер на перше місце 1. в void push_back(const T& x); Додавання нового кінець контейнера. в void pop_front(); Вилучення першого елемента. 1 void pop_back(); Вилучення останнього елемента 1 Лише для списків і деків елемента
Методи модифікації контейнерів 2 Mетод Дія методу iterator insert(iterator position, const T& x); Вставка копії об’єкта в позицію, вказану ітератором. void insert(iterator position, size_type n, const T& x); Вставка n копій об’єкта в позицію, вказану ітератором. template <class Input. Iterator> void insert(iterator position, Input. Iterator first, Input. Iterator last); Вставка в позицію, вказану ітератором, копій об’єктів з послідовності [first, last), заданої ітераторами. iterator erase(iterator position); Вилучає з заданої позиції елемент контейнера; повертає ітератор, настроєний на наступний елемент, або end(), якщо вилучений елемент був останнім в контейнері. iterator erase(iterator first, iterator last); Вилучення з контейнера заданої послідовності елементів; повертає ітератор, настроєний на наступний елемент за останнім вилученим, або end(), якщо вилучений елемент був останнім в контейнері. void clear(); Вилучення з контейнера всіх елементів. void swap(container<T, Alloc>& x); Обмін всіма елементами з аналогічним контейнером.
Методи повернення характеристик контейнера Mетод Дія методу, результат bool empty()const; Повертає true, якщо розмір контейнера нульовий. size_type size()const; Повертає кількість елементів контейнера allocator_type get_allocator()const; Повертає копію розподілювача пам’яті.
Глобальні операції порівняння Mетод Результат операції template <class T, class Alloc> inline bool operator==(const cont<T, Alloc>& x, const cont<T, Alloc>& y); true , якщо контейнер x є таким, як y. template <class T, class Alloc> inline bool operator!=(const cont<T, Alloc>& x, const cont<T, Alloc>& y); true , якщо контейнер x відрізняється від y. template <class T, class Alloc> inline bool operator<(const cont<T, Alloc>& x, const cont<T, Alloc>& y); true, якщо x лексикографічно менший, ніж y. template <class T, class Alloc> inline bool operator>(const cont<T, Alloc>& x, const cont<T, Alloc>& y); true, якщо x лексикографічно більший, ніж y. template <class T, class Alloc> inline bool operator<=(const cont<T, Alloc>& x, const cont<T, Alloc>& y); true, якщо x лексикографічно менший/рівний, ніж y. template <class T, class Alloc> inline bool operator>=(const cont<T, Alloc>& x, const cont<T, Alloc>& y); true, якщо x лексикографічно більший/рівний, ніж y. У таблиці під назвою cont треба розуміти конкретну назву типу послідовного контейнера.
Векторні контейнери
stl_introduction.ppt