- •Определение класса
- •Пример (точка)
- •Оператор вывода (пример)
- •Параметр шаблона по умолчанию (пример)
- •Где перехватывать исключения?
- •Гарантии безопасности исключений
- •Базовые операции
- •Виртуальная функция
- •Использование virtual
- •Массив, как диапазон
- •Контейнер
- •Свойства элемента контейнера
- •Заголовочные файлы
- •Доступ к элементам list
- •Размеры list
- •Доступ к элементам map
- •Очередь с приоритетом
- •Дэк (двусвязная очередь)
- •Матрица (в математике)
- •Атд “матрица”
- •Дерево (доп. Определения)
- •Узел дерева (доп. Определения)
- •“Родственные отношения”
- •“Родственные отношения” (иллюстрация)
- •Баланс в дереве (иллюстрация)
- •Std::less (пример функтора)
- •Std::find_if (пример алгоритма)
- •Функциональные адаптеры
- •Производящая функция
- •Производящие функции для функциональных адаптеров
Доступ к элементам map
через итератор
обобщенный вариант
find insert
через индекс-ключ
T& operator[](const Key& k)
14.04.2012 cppNewb.ru 60
operator[]
если элемент не найден, создает элемент с умолчательным значением
м.б. заменен парой find и insert
пример:
m[studentFio] = lastMark; if (m.end() != m.find(k))
...
14.04.2012 cppNewb.ru 61
Объектно-ориентированное
программирование
с использованием C++
Полевой Дмитрий Валерьевич к.т.н., доцент КиК
e-mail: oop.misis@gmail.com
АТД и структуры данных
АТД определяет набор допустимых операций
структура данных определяет способ хранения информации и совершения операций (физическое размещение в памяти, реализация)
АТД может реализовываться различными структурами данных
часто называются одинаково
21.04.2012
cppNewb.ru 2
Связный список
список – структура данных, состоящая из узлов
предназначен для хранения данных с последовательным доступом
узел содержит как собственно данные,
так и связи с другими узлами
21.04.2012
cppNewb.ru 3
Односвязный список
однонаправленный список
pHead
голова
(первый узел)
0
хвост
(последний узел)
21.04.2012
cppNewb.ru 4
Односвязный список (узел)
struct SList;
struct SList
{
SList* m_pNext;
T m_data;
};
21.04.2012
cppNewb.ru 5
Двусвязный список
двунаправленный список
pHead
0
0
21.04.2012
cppNewb.ru 6
Двусвязный список (узел)
struct DList;
struct DList
{
DList* m_pPrev;
DList* m_pNext; T m_data;
};
21.04.2012
cppNewb.ru 7
Операции над линейным списком
создание (создание первого узла)
уничтожение (удаление всех узлов)
вставка списка (узла)
удаление списка (узла)
навигация по узлам (следующий,
предыдущий)
доступ к данным узла
21.04.2012
cppNewb.ru 8
Навигация по линейному списку
pNode
pHead
0
if (0 != pNode)
{
pNode = pNode->m_pNext;
}
21.04.2012
cppNewb.ru 9
Навигация по линейному списку
pNode
pHead
0
if (0 != pNode)
{
pNode = pNode->m_pNext;
}
21.04.2012
cppNewb.ru 10
Вставка узла
pPos
pHead
0
pN
21.04.2012
cppNewb.ru 11
Вставка узла
pPos
pHead
0
pN
pN->m_pNext = pPos->m_pNext;
21.04.2012
cppNewb.ru 12
Вставка узла
pPos
pHead
0
pN
pPos->m_pNext = pN;
21.04.2012
cppNewb.ru 13
Удаление узла
pHead
0
21.04.2012
cppNewb.ru 14
Удаление узла
pPos
pHead
0
pD
21.04.2012
cppNewb.ru 15
Удаление узла
pPos
pHead
0
pD
pPos->m_pNext = pD->m_pNext;
21.04.2012
cppNewb.ru 16
Удаление узла
pPos
pHead
0
pD 0
delete pD;
pD = 0;
21.04.2012
cppNewb.ru 17
Уничтожение списка
pHead
pD 0
while (0 != pHead)
{
pD = pHead;
pHead = pHead->m_pNext; delete pD;
}
21.04.2012
cppNewb.ru 18
Уничтожение списка
pHead
pD 0
while (0 != pHead)
{
pD = pHead;
pHead = pHead->m_pNext; delete pD;
}
21.04.2012
cppNewb.ru 19
Уничтожение списка
pHead
pD 0
while (0 != pHead)
{
pD = pHead;
pHead = pHead->m_pNext; delete pD;
}
21.04.2012
cppNewb.ru 20
Уничтожение списка
pHead
pD 0
while (0 != pHead)
{
pD = pHead;
pHead = pHead->m_pNext; delete pD;
}
21.04.2012
cppNewb.ru 21
Кольцевой список
циклический (замкнутый) список
pHead
21.04.2012
cppNewb.ru 22
Плюсы списков
простое динамическое добавление и удаление элементов
размер ограничен только объёмом памяти и разрядностью указателей
элементы не перемещаются в памяти
21.04.2012
cppNewb.ru 23
Минусы списков
накладные расходы памяти на связи
“долгое” обращение к элементу по индексу
“долгое” выделение узла
элементы списка могут быть расположены в памяти разреженно (фрагментация памяти, плохо кэшируется)
21.04.2012
cppNewb.ru 24
АТД “cтек”
динамическая структура данных
упорядоченный набор элементов
LIFO (Last In First Out) – добавление и удаление элементов с одного конца, называемого вершиной стека
21.04.2012
cppNewb.ru 25
Стек (схема работы)
вершина
push
pop
getTop
21.04.2012
cppNewb.ru 26
Стек – операции
создание
уничтожение
добавление элемента
удаление элемента
получение значение верхнего элемента
21.04.2012
cppNewb.ru 27
Стек (интерфейс класса)
Stack()
Stack(const Stack& obj)
~Stack()
Stack& operator=(const Stack& rhs) void push(const T& obj)
void pop()
bool isEmpty() const T& getTop()
const T& getTop() const
или
T getTop()
21.04.2012
cppNewb.ru 28
Стек – реализация
динамически массив
линейный список
21.04.2012
cppNewb.ru 29
Стек (динамический массив)
T& getTop()
{
вершина
}
21.04.2012
size_t i(size(s.arr) - 1);
assert(i >= 0); return m_data.at(i);
cppNewb.ru 30
Стек (линейный список массив)
T& getTop()
{
вершина
assert(0 != m_pHead);
return m_pHead->m_data;
}
21.04.2012
cppNewb.ru 31
АТД “очередь”
динамическая структура данных
упорядоченный набор элементов
FIFO (First In First Out) – добавление элементов с одного конца (хвост) и удаление с другого конца (голова)
21.04.2012
cppNewb.ru 32
Очередь - операции
создание
уничтожение
добавление элемента
удаление элемента
получение значение верхнего элемента
21.04.2012
cppNewb.ru 33
Очередь (схема работы)
голова
pop
getTop
push
хвост
21.04.2012
cppNewb.ru 34
Очередь (интерфейс класса)
Queue()
Queue(const Queue& obj)
~Queue()
Queue& operator=(const Queue& rhs) void push(const T& obj)
void pop()
bool isEmpty() const T& getTop()
const T& getTop() const
или
T getTop()
21.04.2012
cppNewb.ru 35
Очередь – реализация
динамический массив
(вставка и извлечение с концов)
динамический массив
(подвижные концы)
список
21.04.2012
cppNewb.ru 36
Очередь (подвижные концы)
iTail |
= |
(iTail |
+ |
1) |
% |
size; |
// |
push |
iHead |
= |
(iHead |
+ |
1) |
% |
size; |
// |
pop |
iHead
size – размер буфера
iTail
21.04.2012
cppNewb.ru 37