
- •Лабораторна робота №1
- •Порядок виконання роботи
- •Завдання 1
- •Завдання 2
- •Завдання 3
- •Теоретичні відомості Масиви динамічної пам'яті
- •Приклад виконання завдання 1
- •Лістинг програми
- •Приклад виконання завдання 2
- •Лістинг програми
- •Приклад виконання завдання 3
- •Лістинг програми
- •Контрольні запитання
- •Лабораторна робота №2
- •Порядок виконання роботи
- •Завдання 1
- •Завдання 2
- •Теоретичні відомості Читання і запис текстових файлів
- •Читання і запис бінарних файлів
- •Відкриття бінарних файлів
- •Файли з послідовним доступом
- •Запис даних у файл з послідовним доступом
- •Файли з довільним доступом
- •Приклад виконання завдання 1
- •Приклад виконання завдання 2
- •Контрольні запитання
- •Лабораторна робота №3
- •Порядок виконання роботи
- •Завдання 1
- •Завдання 2
- •Завдання 3
- •Теоретичні відомості
- •Обмеження доступу до членів класу
- •Специфікатори доступу
- •Вбудовані функції-члени
- •Приклад виконання завдання 1.
- •Приклад виконання завдання 2.
- •Приклад виконання завдання 3.
- •Контрольні запитання
- •Лабораторна робота №4
- •Порядок виконання роботи
- •Завдання 2
- •Теоретичні відомості Конструктори і деструктори
- •Правила роботи з конструкторами і деструкторами
- •Варіант 10. Розробити описовий алгоритм, схему алгоритму і написати метод для підрахування кількості слів в текстовому файлі.
- •Приклад виконання завдання 2
- •Контрольні запитання
- •Лабораторна робота №5
- •Порядок виконання роботи
- •Завдання 1
- •Завдання 2
- •Теоретичні відомості Принципи спадкування в ооп
- •Оголошення похідних класів
- •Конструктори похідного класу
- •Функції члени похідного класу
- •Заборонені члени класу (Protected)
- •Приклад виконання Завдання 1
- •Контрольні запитання
- •Лабораторна робота №6
- •Порядок виконання роботи
- •Завдання 1
- •Теоретичні відомості Перевантаження операторів
- •Приклад виконання завдання 1
- •Приклад виконання завдання 2
- •Приклад виконання завдання 3
- •Приклад виконання завдання 4
- •Контрольні запитання
- •Лабораторна робота №7
- •Порядок виконання роботи
- •Завдання 1.
- •Завдання 2.
- •Теоретичні відомості
- •Структура наслідування класів
- •Постановка задачі
- •Розробити клас трикутника, чотирикутника, кола, точки
- •Контрольні запитання
- •Лабораторна робота №8
- •Порядок виконання роботи
- •Завдання 1
- •Контрольні запитання
- •Лабораторна робота №9
- •Порядок виконання роботи
- •Завдання 1
- •Теоретичні відомості Множинне спадкування
- •Контрольні запитання
- •Лабораторна робота №10
- •Порядок виконання роботи
- •Завдання 1
- •Теоретичні відомості Шаблони
- •Параметризовані класи
- •Визначені об’єкти-потоки
- •Операції поміщення та вилучення
- •Приклад виконання Завдання з варіанту 2
- •Контрольні запитання.
- •Лабораторна робота №11
- •Порядок виконання
- •Завдання 1
- •Завдання 2
- •Завдання 3 Варіант 1. Задача “Банківське переведення” (дата, час, № рахунку, розмір рахунку).
- •Ітератори
- •Для роботи з вектором необхідно:
- •Приклад роботи з вектором
- •Алгоритми
- •Застосування алгоритмів до вектора
- •Приклад 1 виконання Завдання 1
- •Приклад 2 виконання Завдання 2
- •Приклад 3 виконання завдання №3
- •Контрольні запитання
- •Завдання 1
- •Теоретичні відомості Приклад розробки програми
- •Контрольні запитання
- •Лабораторна робота №13
- •Порядок виконання
- •Завдання 2.
- •Теоретичні відомості
- •Стандартні потоки для базових класів
- •Форматування даних при обмінах з потоками
- •Маніпулятори
- •Приклад розробки програми
- •Контрольні запитання
- •Лабораторна робота №14
- •Порядок виконання
- •Завдання
- •Теоретичні відомості
- •Контрольні запитання
Ітератори
Одним з найважлівішіх елементів бібліотеки, поряд з контейнером и узагальнення алгоритмом - ітератор.
Ітератор являє собою клас, що забезпечує доступ до даніх іншого класу, тобто ітератор узагальнює поняття покажчика: він надає доступ до елементів контейнера без необхідності інкапсулювати контейнер. Аналогічно тому, як використовуються звичайні покажчики, ітератори можуть використовуватися для різних цілей. Ітератор може вказувати на конкретній об'єкт, пари ітераторів визначає діапазон об'єктів у послідовності (початок - кінець). При чому елементи послідовності випливають один за одним у логічній послідовності (у фізічній пам'яті вони розташовуються не обов'язково послідовно). Фізична реалізація порядку вибірки елементів з послідовності покладає на контейнери.
Внутрішній устрій ітератора може виглядати так:
class Iterator
{
T * pointer;
public:
T * GetPointer ()
{
return this -> pointer;
}
void SetPointer (T * pointer)
{
this -> pointer = pointer;
}
:
};
У STL існує три типи итераторов: iterator, reverse_iterator, і random access iterator. Для обходу колекції від меншого індексу до більшого, використовуються звичайні або forward ітератори. Для обходу колекції у зворотному напрямку використовуються reverse ітератори. Random access iterator є ітераторами, які можуть обходити колекцію як вперед, так і назад. Нижче наведено приклад використання итераторов для видалення половини елементів вектора:
# Include "stdafx.h"
# Include <iostream>
# Include <vector>
# Include <algorithm>
using namespace std;
void printInt (int number);
int _main (int argc, _TCHAR * argv [])
{
vector <int> myVec;
vector <int> :: iterator first, last;
for (long i = 0; i <10; i + +)
{
myVec.push_back (i);
}
first = myVec.begin ();
last = myVec.begin () + 5;
if (last> = myVec.end ())
{
return - 1;
}
myVec.erase (first, last);
for_each (myVec.begin (), myVec.end (), printInt);
return 0;
}
void printInt (int number)
{
cout << number << endl;
}
Важливо пам'ятати, що коли ви отримуєте ітератор до колекції, а після цього вносите колекцію, то цей ітератор стає вже непридатним до використання. Природно, не всі зміни призводять до непридатності ітератора для подальшого використання, а тільки зміни структури колекції. У разі ж, якщо ви просто зміните значення, збережені в колекції, то нічого страшного не станеться і ітератор не зіпсується.
Ітерація по колекції вперед відбувається так:
for (iterator element = begin (); element <end (); element + +)
{
t = (* element);
}
Ітерація по колекції назад відбувається так:
for (reverse_iterator element = rbegin (); element <rend ();
element + +)
{ t = (* element); }
Якщо ви працюєте і з random access iterator ітератором, то синтаксис конструкції може бути, наприклад, таким:
for (iterator element = begin (); element <end ();
element + = 2)
{
t = (* element);
}
Для більш ефективного використання контейнерів використовуйте typedef або наслідуйте свій клас від класу колекції.
Зробити це можна так:
typedef vector <int> myVector
typedef map <string, int> myMap
typedef deque <string> myQue
Або ось така техніка в разі спадкування:
class myVector: public vector <int> {};
У випадку з ітератором застосовна попередня техніка:
typedef myVector :: iterator vectorIterator
typedef myVector :: reverse_iterator revVectorIterator