Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции С++.docx
Скачиваний:
4
Добавлен:
22.09.2019
Размер:
6.95 Mб
Скачать

Доступ к элементам 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