- •Міністерство освіти і науки україни
- •Розділ 1. Інкапсуляція та приховування інформації
- •1.1 Визначення та використання класів
- •1.2. Поля і методи класів
- •1.2.1 Поля і методи класів
- •1.2.2 Опис об’єктів
- •1.2.3 Вказівка this
- •Void cure(int health, int ammo)
- •1.3 Інкапсуляція та приховування інформації
- •1.3.1. Приховані дані
- •1.3.2. Загальнодоступні і приватні члени класу
- •1.3.3. Захищені члени класу
- •Void b::fb()
- •Void c::fc()
- •Void c::fc(a&a)
- •Void main()
- •1.3.4. Організація загального інтерфейсу
- •Void main()
- •1.4 Конструктори і деструктори
- •Void main()
- •Завдання
- •Розділ 2. Класи і підкласи
- •2.1. Конструктор копіювання
- •2.2 Вкладені класи
- •Void External::Inner::MethodInner(const External &t)
- •2.3 Статичні елементи класу
- •2.3.1 Статичні поля
- •2.3.2 Статичні методи
- •Void f()
- •2.4 Дружні функції і класи
- •2.4.1 Дружня функція
- •Void Spouse(Person &p)
- •Void main()
- •2.4.2 Дружній клас
- •Завдання
- •Розділ 3. Спадкування класів
- •3.1 Спадкування класів
- •Void b::bb(int u)
- •Void main()
- •Приклад.
- •Void main()
- •Void main()
- •Void main()
- •3.2 Множинне спадкування
- •Void main()
- •Void main()
- •3.3. Типовий приклад спадкування
- •Void DatabaseObject::Display ( )
- •Завдання
- •Розділ 4. Поліморфізм
- •4.1. Віртуальні функції
- •Void main()
- •Void main()
- •4.2 Абстрактні класи
- •Void show(a* a)
- •Void main()
- •4.3. Приклади поліморфізму
- •Virtual double f1()
- •Void main()
- •4.4. Внутрішнє представлення об’єктів і таблиця методів
- •Void do_(a& a)
- •Void main()
- •Void show(a* a)
- •Void main()
- •Завдання
- •Розділ 5. Перевантаження операторів
- •5.1 Загальні відомості
- •5.2 Перевантаження унарних операторів
- •Int geth()
- •Void set_h (int h)
- •5.3 Перевантаження бінарних операторів та операторів присвоювання
- •Void main()
- •5.4 Перевантаження операторів new і delete
- •Void * pObj::operator new(size_t size)
- •Void pObj::operator delete(void* ObjToDie, size_t size)
- •5.5 Перевантаження оператору приведення типу
- •Operator ім’я нового типу ();
- •5.6 Перевантаження оператору виклику функції
- •5.7 Перевантаження оператору індексування
- •Vect::Vect (int n): size(n)
- •Завдання
- •Розділ 6. Обробка виключних ситуацій
- •6.1 Загальні відомості про виключні ситуації
- •6.2 Синтаксис виключень
- •6.3 Перехоплення виключень
- •Void f1()
- •Void f2()
- •Void main()
- •Void GotoXy(int X, int y)
- •Void kontr (char* str) throw (const char*)
- •Void main()
- •Void MyFunc()
- •Void main()
- •6.4 Список виключень функції
- •6.5 Виключення в конструкторах та деструкторах
- •6.6 Ієрархії виключень
- •Завдання
- •Розділ 7. Рядки
- •Void main ()
- •7.1.1 Конструктори і операції привласнення
- •7.1.2 Операції
- •7.2. Функції класу string
- •7.2.1 Привласнення і додавання частин рядків
- •7.2.2 Перетворення рядків
- •Void main ()
- •7.2.3 Пошук підрядків
- •Void main()
- •7.2.3 Порівняння частин рядків
- •Void main ()
- •7.2.4 Отримання характеристик рядків
- •Завдання
- •Розділ 8. Шаблони класів
- •8.1. Загальна характеристика динамічних структур даних
- •8.2. Стек
- •Void main()
- •Void push(Node **top, int d)
- •Int pop (Node **top)
- •8.3. Черга
- •Void main()
- •Void add(Node **pend, int d)
- •Int del(Node **pbeg)
- •8.4. Лінійний список
- •Void main()
- •Void add(Node **pend, int d)
- •8.5. Шаблони функцій
- •Void main()
- •Void myfunc(type1 X, type2 y)
- •Void main()
- •8.6 Загальні відомості шаблонів класів
- •Void List ::print()
- •Void List::print_back()
- •Void main()
- •8.7 Створення шаблонів-класів
- •Void main()
- •8.8 Спеціалізація шаблонів класів
- •8.9 Переваги та недоліки шаблонів
- •Завдання
- •Розділ 9. Модульні програми (проектування об’єктно-орієнтованого програмування)
- •9.1 Короткі відомості
- •9.2 Збірка вихідних текстів
- •Void main()
- •9.3 Відділення інтерфейсу від реалізації
- •9.4 Шаблони та модульність. Простір імен
- •9.5 Фізичне розділення простору імен
- •9.6 Міжмодульні змінні та функції
- •9.7 Ініціалізація глобальних об'єктів
- •Завдання
- •Розділ 10. Контейнерні класи
- •10.1 Загальні відомості
- •10.2 Послідовні контейнери
- •Void main()
- •10.2.1 Вектори (vector)
- •Void main()
- •Void main()
- •10.2.2. Двосторонні черги (deque)
- •10.2.3 Списки (list)
- •Void main()
- •Void main()
- •10.2.4 Стеки (stack)
- •Void main()
- •10.2.5 Черги (queue)
- •Void main()
- •Void main()
- •10.2.6 Черги з пріоритетами (priority_queue)
- •Void main()
- •Void main()
- •10.3 Асоціативні контейнери
- •10.3.1 Загальні відомості про асоціативні контейнери
- •Void main()
- •10.3.2 Словники (map)
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •10.3.3 Множини (set)
- •Void main()
- •Void main()
- •Завдання
- •Розділ 11. Алгоритми
- •11.1 Ітератори
- •11.2 Функціональні об'єкти
- •Void main()
- •Void main()
- •11.3 Алгоритми
- •11.3.1 Немодифікуючі операції з послідовностями
- •Void main ()
- •Void main()
- •Void main()
- •11.3.2 Модифікуючі операції з послідовностями
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •11.3.3 Алгоритми, пов'язані з сортуванням
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •11.3.4 Узагальнені чисельні алгоритми
- •Void main()
- •Void main()
- •Завдання
- •Список літератури
Розділ 11. Алгоритми
11.1 Ітератори
Ітератор – це узагальнення поняття вказівки для роботи з різними структурами даних стандартним способом. Для того, щоб можна було реалізувати алгоритми, які коректно і ефективно працюють з даними різної структури, стандарт визначає не тільки інтерфейс, але й вимоги до часу доступу за допомогою ітераторів. Оскільки ітератор є узагальненням поняття "вказівка", семантика у них однакова, і всі функції, що приймають в якості параметрів ітератори, можуть також працювати із звичайними вказівками. У стандартній бібліотеці ітератори використовуються для роботи з контейнерними класами, потоками і буферами потоків.
У ітераторах використовуються поняття "Поточний вказуваний елемент" і "вказати на наступний елемент". Доступ до поточного елементу послідовності виконується аналогічно вказівкам за допомогою операцій "*" та "->". Перехід до наступного елементу – за допомогою операції інкремента ++. Для всіх ітераторів визначені також привласнення, перевірка на рівність і нерівність.
Дані можуть бути організовані різним чином – наприклад, у вигляді масиву, списку, вектора або дерева. Для кожного виду послідовності потрібний свій тип ітератора, що підтримує різні набори операцій. Відповідно до набору забезпечуваних операцій ітератори діляться на п'ять категорій, описаних в таблиці 11.1.
Нехай i та j – ітератори одного виду, х – змінна того ж типу, що і елемент послідовності, n – ціла величина. Тоді допустимі вирази:
i++ ; ++i; i = j; i!=j
Таблиця 11.1 Категорії ітераторів
-
Категорія ітератора
Операції
Контейнери
вхідний (input)
x = *i
всі
вихідний (output)
*i = x
всі
прямий (forward)
x = * i , * i = x
всі
двонаправлений
(bidirectional)
x = *i , *i = x,
-- i , i--
всі
довільного доступу
(random access)
x = *i , *i = x, -- i , i--,
i + n, i - n, i += n, i -= n,
i < j , i > j , i <= j , i >= j
всі, окрім list
Ітераторні класи і функції описані в заголовному файлі <iterator>. При використанні стандартних контейнерів цей файл підключається автоматично. Ітератори можуть бути константними. Константні ітератори використовуються тоді, коли змінювати значення відповідних елементів контейнера немає необхідності.
Перераховані ітератори мають свої різновиди, так звані адаптери ітераторів. Розглянемо наступні адаптери: зворотні ітератори, ітератори вставки та потокові ітератори.
Зворотний ітератор reverse_iterator, що є різновидом двонаправлених ітераторів та ітераторів довільного доступу, дозволяє продивлятися послідовність у зворотному напрямі.
Наприклад, щоб продивитись вектор в зворотному порядку, можна скористатися наступним циклом:
vector <int> v;
for (vector <int> reverse_iterator i = v.rbegin();
i != v.rend; ++i)
cout << *i << " ";
Якщо контейнер оголошений як const (наприклад, в списку передаваних функції параметрів), то потрібно використовувати ітератор з префіксом const _const_reverse_iterator.
Ітератори вставки призначені для додавання нових елементів в початок, кінець або довільне місце контейнера. У стандартній бібліотеці визначено три шаблони класів ітераторів вставки, побудованих на основі вихідних ітераторів: back_insert_iterator, front_insert iterator і insert iterator. У цих ітераторах, а вони як і всі ітератори, є класами, визначено три функції: back_inserter() – вставляє елементи в кінець контейнера, front_inserter() – в початок, а inserter() – перед елементом, на який посилається її аргумент-ітератор. Приклад їх використання приведений нижче при описі алгоритмів.
Потокові ітератори введені для того, щоб стандартні алгоритми, які розглядаються при описі алгоритмів могли безпосередньо використовувати потоки введення/виведення. Потоки представляються у вигляді послідовностей. Визначено два шаблони класів потокових ітераторів: ітератор вхідного потоку istreamiterator і ітератор вихідного потоку ostreamiterator.