Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекції 2012-2013ооп.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
6.61 Mб
Скачать

8.4. Поняття про контейнери, ітератори, функціональні об' єкти та алгоритми stl.

У 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

Контейнер vector -вектор.

Вектор vector в STL визначений як динамічний масив з доступом до його елементів по індексу.

template<class T, class Allocator=allocator<T>>class std::vector{..};

де T - тип призначених для зберігання даних.

Allocator задає розподільник пам' яті, що за замовчуванням є стандартним.

У класі vector визначені наступні конструктори :

explicit vector(const Allocator& a=Allocator());

explicit vector(size_type число, const T&значення= T(), const Allocator&a= =Allocator());

vector(const vector<T, Allocator>&об' єкт);

template<class InIter>vector(InIter качан, InIter кінець, const Allocator&a= =Allocator());

Деручи форма являє собою конструктор порожнього вектору.

У другій формі конструктора вектору число елементів - це число, а кожний елемент дорівнює значенню значення. Параметр значення може бути значенням за замовчуванням.

Третя форма конструктора вектор - це конструктор копіювання.

Четверта форма - це конструктор вектору, що містить діапазон елементів, завдань ітераторами качан і кінець.

Приклад 2.

vector<int> a;

vector<double> x(5);

vector<char> c(5'*');

vector<int> b(a); //b=a

Для будь-якого об' єкта, що буде зберігатися у векторі, має бути визначений конструктор за замовчуванням. Крім того, для об' єкта повинні бути визначені оператори < і ==.

Для класу вектор визначені наступні оператори порівняння :

==, <, <=, !=, >, >=.

Крім цього, для класу vector визначається оператор індексу [].

  • Нові елементи можуть включатися за допомогою функцій

insert(), push_back(), resize(), assign().

  • Існуючі елементи можуть видалятися за допомогою функцій

erase(), pop_back(), resize(), clear().

  • Доступ до окремих елементів здійснюється за допомогою ітераторів

begin(), end(), rbegin(), rend(),

  • Маніпулювання контейнером, сортування, пошук у ньому худе можливо за допомогою глобальних функцій файлу ( заголовка <algorithm.h>.

Приклад 3.

##include<iostream.h>

##include<vector.h>

using namespace std;

void main()

{vector<int> v;

int i;

for(i=0;i<10;i++) v.push_back(i);

cout<<"size="<<v.size()<<"\n";

for(i=0;i<10;i++) cout<<v[i]<<" ";

cout<<endl;

for(i=0;i<10;i++) v[i]=v[i]+v[i];

for(i=0;i<v.size();i++) cout<<v[i]<<" ";

cout<<endl;

}

Приклад 4. Доступ до вектору через ітератор.

##include<iostream.h>

##include<vector.h>

using namespace std;

void main()

{vector<int> v;

int i;

for(i=0;i<10;i++) v.push_back(i);

cout<<"size="<<v.size()<<"\n";

vector<int>::iterator p=v.begin();

while(p!=v.end())

{cout<<*p<<" ";p++;}

}

Приклад 5. Вставка й видалення елементів.

##include<iostream.h>

##include<vector.h>

using namespace std;

void main()

{vector<int> v(5,1);

int i;

////висновок

for(i=0;i<5;i++) cout<<v[i]<<" ";

cout<<endl;

vector<int>::iterator p=v.begin();

p+=2;

////вставити 10 елементів зі значенням 9

v.insert(p, 10,9);

////висновок

p=v.begin();

while(p!=v.end())

{cout<<*p<<" ";p++;}

////видалити вставлені елементи

p=v.begin();

p+=2;

v.erase(p, p+10);

////висновок

p=v.begin();

while(p!=v.end())

{cout<<*p<<" ";p++;}

}

Приклад 6. Вектор містить об' єкти користувацького класу.

##include<iostream.h>

##include<vector.h>

##include" student.h"

using namespace std;

void main()

{vector<STUDENT> v(3);

int i;

v[0]=STUDENT("Іванов", 45.9);

v[1]=STUDENT("Петров", 30.4);

v[0]=STUDENT("Сидоров", 55.6);

////висновок

for(i=0;i<3;i++) cout<<v[i]<<" ";

cout<<endl;

}

Література

  1. Катаев М.Ю. Объектно-ориентированное программирование: Учебное пособие. - Томск: Томский межвузовский центр дистанционного образования, 2000. - 145 с.

  2. Кент Рейсдорф и Кен Хендерсон BORLAND C++BUILDER. ОСВОЙ САМОСТОЯТЕЛЬНО

  3. Лафоре Р. Обьектно–ориентированное программирование в С++. 4-е изд.: – СПб: Питер, 2004 – 902 с.

  4. Львов М.С., Співаковський О.В. Вступ до об’єктно-орієнтоване програмування. Навчальний посібник. - Херсон: ХГПУ, 2000.- 238 с.:іл.

  5. М.С. Львов. О.В. СпіваковськийВступ до об’єктно-орієнтоване програмування. Навчальний посібник. - Херсон: ХГПУ, 2000.- 238 с.:іл.

  6. Шилдт Герберт. Искусство программирования на С++. Санкт-Питербург, 2005.-496 с., ил.

  7. Шилдт, Герберт. C++: руководство для начинающих, 2-е издание. : Пер. с англ. — М. : Издатель- ский дом "Вильяме", 2005. — 672 с. : ил. — Парал. тит. англ.

  8. Эккель Брюс. Философия С++. Введение в стандартный С++ (2-е издание). - СПб: Питер, 2004 – 573 с.

  9. Эккель Брюс. Философия С++. Практическое программирование (2-е издание). - СПб: Питер, 2004 – 610 с., ил.

  10. Юркова Т. А., Ушаков Д. М., Паскаль для школьников. — СПб.: Питер, 2010. — 256 с.: ил.

  11. Visual Studio 2010 и введение в .NET 4.0 и для профессионалов. Макки, Алекс : Пер. с англ. — М. : ООО И. Д. Вильямс". 2010. — 416 с. : ил. — Парал, тит. англ.