Здавалка
Главная | Обратная связь

Основний зміст роботи.



Написати чотири програми з використанням STL. Перша і друга програми повинні демонструвати роботу з контейнерами STL, третя і четверта — використання алгоритмів STL.

Основні теоретичні відомості.

Стандартна бібліотека шаблонів (STL).

STL забезпечує загально цільові, стандартні класи і функції, що реалізують найбільш популярні і широко використовувані алгоритми і структури даних.

STL будується на основі шаблонів класів і тому вхідні в неї алгоритми і структури застосовуються майже до всіх типів даних.

Склад STL.

Ядро бібліотеки утворять три елементи: контейнери, алгоритми і ітератори.

Контейнери (containers) – це об'єкти, призначені для збереження інших елементів. Наприклад: вектор, лінійний список, множина.

Асоціативні контейнери (associative containers) дозволяють за допомогою ключів одержати швидкий доступ до значень, що зберігаються в них.

У кожному класі-контейнері визначений набір функцій для роботи з ними. Наприклад: список містить функції для вставки, видалення і злиття елементів.

Алгоритми (algorithms) виконують операції над змістом контейнера. Існують алгоритми для ініціалізації, сортування, пошуку, заміни вмісту контейнерів. Багато алгоритмів призначені для роботи з послідовністю (sequence), що являє собою лінійний список елементів всередині контейнера.

Ітератори (iterators) – це об'єкти, що стосовно контейнера відіграють роль покажчиків. Вони дозволяють одержати доступ до вмісту контейнера приблизно так, як покажчики використовуються для доступу до елементів масиву.

З ітераторами можна працювати так само, як з покажчиками. До них можна застосувати операції *, інкремента, декремента. Типом ітератор являється тип iterator, що визначений у різних контейнерах.

Існує п'ять типів ітераторів:

1.Ітератори вводу(input_iterator) підтримують операції рівності, розіменування та інкремента.

==, !=, *i, ++i, i++, *i++

Спеціальним випадком ітератора вводу є istream_iterator.

2.Ітератори виводу(output_iterator) підтримують операції розіменування, припустиме тільки з лівої сторони присвоювання та інкремента.

++i, i++, *i=t, *i++=t

Спеціальним випадком ітератора виводу є ostream_iterator.

3.Односпрямовані літератори(forward_iterator) підтримують всі операції ітераторів вводу/виводу і, крім того, дозволяють без обмеження застосовувати присвоювання:

==, !=, =, *i, ++i, i++, *i++

4.Двохнаправлені літератори(biderectional_iterator) мають усі властивості forward-ітераторів, а також мають додаткову операцію декремента (--i, i--, *i--), що дозволяє їм проходити контейнер в обох напрямках.

5.Ітератори довільного доступу(random_access_iterator) мають усі властивості biderectional-ітераторів, а також підтримують операції порівняння та адресної арифметики, а саме безпосередній доступ за індексом.

i+=n, i+n, i-=n, i-n, i1-i2, i[n], i1<i2, i1<=i2, i1>i2, i1>=i2

У STL також підтримуються зворотні ітератори (reverse iterators). Зворотніми ітераторами можуть бути або двонаправлені ітератори, або ітератори довільного доступу, але минаючі послідовність у зворотному напрямку.

Надодачу до контейнерів, алгоритмів і ітераторів у STL підтримується ще кілька стандартних компонентів. Головними серед них є розподільники пам'яті, предикати і функції порівняння.

У кожного контейнера є визначений для нього розподільник пам'яті (allocator), що керує процесом виділення пам'яті для контейнера.

За замовчуванням розподільником пам'яті є об'єкт класу allocator. Можна визначити власний розподільник.

У деяких алгоритмах і контейнерах використовується функція особливого типу, що називається предикатом. Предикат може бути унарним і бінарним. Значення, що повертається: істина або неправда. Точні умови одержання того чи іншого значення визначаються програмістом. Тип унарних предикатів UnPred, бінарних – BinPred. Тип аргументів відповідає типу об'єктів, що зберігаються в контейнері.

Визначено спеціальний тип бінарного предиката для порівняння двох елементів. Він називається функцією порівняння (comparison function). Функція повертає істину, якщо перший елемент менше другого. Типом функції є тип Comp.

Особливу роль у STL грають об'єкти-функції.

Об'єкти-функції - це екземпляри класу, у якому визначена операція “круглі дужки” (). У ряді випадків зручно замінити функцію на об'єкт - функцію. Коли об'єкт – функція використовується як функцію, то для її виклику використовується operatot().

Приклад 1.

class less{

public:

bool operator()(int x,int y)

{return x<y;}

};

Класи-контейнери.

У STL визначені два типи контейнерів – послідовності й асоціативні контейнери.

Ключова ідеядля стандартних контейнерів полягає в тім, що коли це представляється розумним, вони повинні бути логічно взаємозамінними. Користувач може вибирати між ними, ґрунтуючись на розуміннях ефективності і потреби в спеціалізованих операціях. Наприклад, якщо часто потрібен пошук по ключі. можна скористатися map (асоціативним масивом). З іншого боку, якщо переважають операції, характерні для списків, можна скористатися контейнером list. Якщо додавання і видалення елементів часто виконується в кінці контейнера, варто подумати про використання черги queue, черги з двома кінцями deque, стека stack. За замовчуванням користувач повинний використовувати vector; він реалізований, щоб добре працювати для самого широкого діапазону задач.

Ідея звертання з різними видами контейнерів – і, у загальному випадку, із усіма видами джерел інформації – уніфікованим способом, веде до поняття узагальненого програмування. Для підтримки цієї ідеї STL містить множину узагальнених алгоритмів. Такі алгоритми рятують програміста від необхідності знати подробиці окремих контейнерів.

У STL визначені наступні класи-контейнери(у кутових дужках зазначені заголовні файли, де визначені ці класи):

bitset множину бітів <bitset.h>

vector динамічний масив <vector.h>

list лінійний список <list.h>

deque двостороння черга <deque.h>

stack стек <stack.h>

queue черга <queue.h>

priority_queueчерга з пріоритетом <queue.h>

map асоціативний список для збереження пар ключ/значення, де з кожним ключем зв'язане одне значення <map.h>

multimap з кожним ключем зв'язано два чи більше значення <map.h>

set множина <set.h>

multiset множина, у якій кожен елемент не обов'язково унікальний <set.h>

Огляд операцій

Типи

value_typeтип елемента

allocator_type тип розподільника пам'яті

size_type тип індексів, лічильника елементів і т.д.

iterator поводиться як value_type*

reverse_iterator переглядає контейнер у зворотному порядку

reference поводиться як value_type&

key_type тип ключа (тільки для асоціативних контейнерів)

key_compare тип критерію порівняння (тільки для асоціативних контейнерів)

mapped_type тип відображеного значення

Ітератори

begin() вказує на перший елемент

end() вказує на елемент, що випливає за останнім

rbegin() вказує на перший елемент у зворотній послідовності

rend() вказує на елемент, що випливає за останнім у зворотній послідовності

Доступ до елементів

front() посилання на перший елемент

back() посилання на останній елемент

operator[](i) доступ за індексом без перевірки

at(i) доступ за індексом з перевіркою

Включення елементів

insert(p,x) додавання х перед елементом, на який вказує р

insert(p,n,x) додавання n копій х перед р

insert(p,first,last) додавання елементів з [first:last] перед р

push_back(x) додавання х в кінець

push_front(x) додавання нового першого елемента (тільки для списків і черг із двома кінцями)

Видалення елементів

pop_back() видалення останнього елемента

pop_front() видалення першого елемента (тільки для списків і черг із двома кінцями)

erase(p) видалення елемента в позиції р

erase(first,last) видалення елементів з [first:last]

clear() видалення всіх елементів

Інші операції

size() число елементів

empty() контейнер порожній?

capacity()пам'ять, виділена під вектор (тільки для векторів)

reserve(n) виділяє пам'ять для контейнера під n елементів

resize(n) змінює розмір контейнера (тільки для векторів, списків і черг із двома кінцями)

swap(x) обмін місцями двох контейнерів

==, !=, < операції порівняння

Операції присвоювання

operator=(x) контейнеру привласнюються елементи контейнера х

assign(n,x) присвоювання контейнеру n копій елементів х (не для асоціативних контейнерів)

assign(first,last) присвоювання елементів з діапазону [first:last]

Асоціативні операції

operator[](k)доступ до елемента з ключем k

find(k) знаходить елемент із ключем k

lower_bound(k) знаходить перший елемент із ключем k

upper_bound(k) знаходить перший елемент із ключем великим k equal_range(k) знаходить lower_bound (нижню границю) і upper_bound (верхню границю) елементів із ключем k







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.