Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP второй семестр.doc
Скачиваний:
4
Добавлен:
23.09.2019
Размер:
187.9 Кб
Скачать

Параграф 5 - перегрузка операций

Для любого класса мы можем определить как будут выполняться те или иные операции. Позволяет определить операции для новых классов, каким образом они будут выполняться.

Перегрузка операторов реализуется с помощью специальных операторов функций.

Создание операторной функции:

Тип имя_класса::operator# (список_аргументов)

{ операции ; над ; классом ; }

вместо # знак оператора (+, -, /,-=, +=,<<,>>,%)

Операторная функция может быть как членом класса, так и не быть им, во втором случае

Обычно определяется как «друзья»

варианты реализации:

-метод класса (z1+=z2); - выносятся операции изменяющие значение - вызывается через объект класса, левый операнд должен быть объектом этого класса, тоесть 5+(3+i) не будет выполнено если не будет конструктора сделавшего из 5 комплексного числа.

При использовании += и т.д. изменяется сам объект.

-не метод класса (вне класса) (z1+z2 аналогично operator+(z1,z2)) - выносятся бинарные операции

перегрузка операций поместить в поток вывода << , и ввода >>

стандартные потоки вывода: cout cin можtм использовать только для стандартных типов данных, если мы её перегрузим, тогда мы сможем выводить например комплексные числа.

ostream & operator<<(double) // те << является классом ostream

Параграф 6 Статические компоненты класса (стр 506)

1) статические данные (переменные) класса

переменная, которая является частью класса, но не является частью объекта этого класса называется статистической.

Статистическая переменная описана в классе и существует в единственном экземпляре, внутри класса она глобальная, она может существовать даже когда не существует ни одного объекта класс. Доступ - по имени класса или через объект, что тоже возможно. Глобальная переменная с областью видимости только внутри класса - самое важное!!

static h:

class X

{

int a; public:

static int b; //обязательно надо приснициализировать!

};

cpp:

{

int x::b=1 //вот и инициализация

}

main ()

{

X obj,ob2; //каждый имеет независимую копию, но переменная b у них одна

cout << X::b<< endl;

x::b=-5; //пока в паблике можем менять

cout << obg.b<</t<<obj2.b<<endl; //выведет -5 -5

}

Статические функции-члены (статические методы) класса

static

могут использоваться через имя объекта, либо используя имя своего класса работает только со статическими методами либо другими статическими даннынми.

a теперь по нормальному

h:

class X

{

static int b;

public:

static int voi set_b (int);

static int voi get_b (int);

x();

}

int main ()

{

x::set_b(5);

cout <<x::get_b()<< endl; /выведется пять

obj1.bget_b();

obj2.get)b();

};

см класс date;

Параграф 8 - класс-контейнер (справочник 642)

классы-контейнеры - классы проектируемые для хранения коллекций (наборов) объектов определенных типов данных.

проектируем их в виде шаблонов

типы:

1)vector – динамический массив

2) list, linuted list - односвязные и двусвязные списки (справочник 646)

3) бинарные деревья (binary trees) - эфф сортировка,эфф поиск бинарный,

4) хэш таблицы - опимизированная для вставки и поиска элементов,

5) stack - стек

каждый контейнер должен предусматривать вставку, удаление, сортировку и поиск элементов. Каждый контейнер специализируется - преимущество в определенной задаче.

1) Векторы – динамические массивы, элементы хранятся последовательно в ячейках. Неэффективны вставка и удаление, эффективна сортировка

класс можно описать как вложенный класс - он будет объектом объемлющего класса.

vector - объемлющий

iterator - вложенный

class A

{

private: int x;

privat:double get_b();

class B{

}

...

}

методы класса А не имеют доступа в privat часть класса В

методы класса В не имеют доступа в privat часть класса А

в зависимости от того, где мы объявляем

в паблик - может создать и использовать объек класса В (чаще всего объявляем тут)

в приват - не можем

A::B obj - имя класса!

}

если требуется чтобы методу А требуется доступ в приват В то, class B{ friend class A...}

смотрим primer.cpp

2) односвязные списки - контейнер состоящий из набора узлов, где каждый узел содержит 2 элемента: элемент данных и ссылка на следующий (адрес следующего узла списка).

(эффективна вставка элемента и удаление, сортировка и поиск - неэффективны)

Списки:

а) Замкнутые (Циклические) – в конце ссылка на первый элемент

b) Незамкнутые – в конце NULL (нулевая ссылка)

Фиктивный узел – следующий за последним (он же пустышка)

преимущества структуры - гибкость по отношении к вставке, удалению элемента (сортировка - в векторе, а не тут) отличие списков от вектора- элементы списка могут быть разбросаны в памяти как угодно (это гуд!) для того чтобы найти итый элемент надо пройти весь путь от первого до нужного ( поиск циклом)

псевдокод:

stract Node { Item data(данные), Node* next (ссылка);}

Note new_node (data);

new_node->next=x->next; //вставка типа

x-> next = &new_node;

//удаление

x-> next= x->next->next;

node * tmp = x-> next;

delete tmp;

node* x;

//поиск в списке

for (node* x!= begin x!=NULL; x= x-> next;

if ( x-> data == key)

break;

BST – binary search tree (узлы имеют не более двух потомков)

http://algolist.manual.ru/ds/btree.php

BST – структурированная коллекция узлов, которые удовлетворяют правилу:

Значение в каждом узле левого поддерева должно быть меньше значения главного узла, и больше для правого узла.

А – корень,

В – левый потомок А

С – правый потомок А

В – корень левого поддерева А

Квадраты - листья

Размер – число внутренних узлов (в кружках)

Предок (родитель) узла p называется узел n, такой, что p – потомок узла n

Длина пути – число ребер между узлами.

Уровни: А – нулевой уровень,

B, C – первый уровень и т.д.

В зависимости от порядка на одинаковых наборах будут получаться разные деревья.

1) 5 7 2 3 8

2) 7 8 3 5 2

3) 2 3 5 7 8

Операции:

  • вставка

  • удаление (3 варианта)

    1. удаление листа – удаляет узел, обнуляем указатель родителя.

    2. если один потомок

    3. если два потомка :

выбираем самый большой из левого поддерева (самый правый из левого поддерева) или самый маленький из правого поддерева (самый левый из правого)

заменяем значение в х

удаляем лист

  • поиск

Виды обходов дерева:

Обход двоичного дерева – это процесс, при котором каждый узел посещается только один раз.

1) симметричный обход - сначала в симметричный обход левого поддерева, затем посещения корня и потом в симметричный обход правого поддерева.

При симметричном обходе каждого из двоичных деревьев поиска, показанных на рис. 2, узлы посещаются в возрастающем порядке: 2, 3, 5, 7, 8.

2) прямой обход - Для корня дерева рекурсивно вызывается следующая процедура:

Посетить узел

Обойти левое поддерево

Обойти правое поддерево

3) Обратный обход

Обойти левое поддерево

Обойти правое поддерево

Посетить узел

Балансировка деревьев

AVL деревья

Деревья бывают сбалансированные и несбалансированные (они получаются из частично или полностью отсортированных списков)

У сбалансированного дерева каждый узел удовлетворяет условию: для любого узла разность длин левого и правого поддерева не больше 1.

AVL дерево: balance {-1,0,1} = высота правого поддерева - высота левого поддерева

Обычная вставка может разбалансировать дерево.

Способы балансировки дерева:

  1. левое вращение

  2. правое вращение

  3. двойное левое вращение (простое правое + простое левое)

  4. двойное правое вращение (простое левое + простое правое)

левое вращение правое вращение

двойное левое вращение (простое правое + простое левое)

двойное правое вращение (простое левое + простое правое)

параграф 9

стандартная библиотека шаблонов STL (Standard Template Library) (стр 522)

Библиотека STL – набор шаблонных классов и функций общего назначения.

Основную роль в разработке STL сыграли Степанов и Страуструп

Ядро библиотеки состоит из трех ключевых элементов:

1) шаблоны классов-контейнеров (контейнеры)

2) итераторы

3) обобщенные алгоритмы (алгоритмы)

Контейнеры (стр 522)– объекты содержащие другие объекты, существует несколько типов контейнеров, например:

  1. Последовательные контейнеры(базовые в STL): vector – определяет динамический массив, queue – двустороннюю очередь, а класс list – обеспечивает работу с линейным списком

  2. Ассоциативные контейнеры(деревья): класс map позволяющий хранить пару «ключ-значение», multimap – ключ – несколько значений //переводчик

Каждый контейнерный класс определяет набор функций, который можно применять к данному контейнеру.

Итераторы (стр 522) – объекты действующие подобно указателям, позволяют циклически опрашивать содержимое контейнера. Существует пять типов итераторов:

  1. произвольного доступа – random acces – сохраняют и считывают значения, позволяют организовать произвольный доступ к элементам

  2. двунаправленные – bidirectional - сохраняют и считывают значения, обеспечивают инкрементно – декрементное перемещение

  3. однонаправленные – forward - сохраняют и считывают значения, обеспечивают только инкрементное перемещение

  4. входные – input – считывают, но не записывают значения, обеспечивают инкрементное перемещение

  5. выходные – output – записывают, но не считывают значения, обеспечивают инкрементное перемещение

Алгоритмы (стр 551) - обрабатывают данные, содержащиеся в контейнерах. Позволяют работать с двумя различными типами контейнеров одновременно (последовательные и ассоциативные). Требуется заголовок - <algorithm>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]