Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

104 Глава 3. Множества, связанные списки и рекурсия

3.1 Используя Множества

В этой секции мы исследуем несколько применений множеств - конкретные структуры данных, введенные в Разделе 1.1.3, которые получают доступ к их записям, используя индексы целого числа.

3.1.1 Хранение записей игры во множестве

Первое применение, которое мы изучаем, для хранения записей во множестве; в частности высоко

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

Давайте начнем, думая о том, что мы хотим включать в объект, представляют - луг высокий вход счета. Очевидно, один компонент, чтобы включать является целым числом repre-senting сам счет, который мы называем счетом. Другой полезной вещью включать является имя человека, зарабатывающего этот счет, который мы просто называем именем. Мы могли продолжить отсюда, добавив области, представляющие дату, которая счет был заработан или игра statis-тики, которые привели к тому счету. Давайте сохранять наш пример простым, однако, и давайте просто иметь две области, счет и имя. Структуру класса показывают в Кодовом Фрагменте 3.1.

класс GameEntry //вход счета игры

общественность:

GameEntry (константа string& n = «», интервал s=0);//конструктор

натяните getName () константа; интервал getScore () константа;

частный:

имя строки; международный счет;

;

//доберитесь имя игрока//получают счет

//имя игрока//счет игрока

Кодовый Фрагмент 3.1: C ++ класс, представляющий вход игры.

В Кодовом Фрагменте 3.2, мы предоставляем определения конструктора класса и двух accessor членских функций.

GameEntry:: GameEntry (константа string& n, интервал s)//конструктор

: имя (n), счет (а)

//accessors

последовательность GameEntry:: getName () константавозвращают имя;

международный GameEntry:: getScore () константавозвращают счет;

Кодовый Фрагмент 3.2: конструктор GameEntry и accessors.

3.1. Используя множества 105

Класс для рекордов

Давайте теперь проектируем класс, названный Очками, хранить нашу информацию счета игры. Мы храним самые высокие очки во множестве записи. Максимальное количество очков может измениться от случая до случая, таким образом, мы создаем членскую переменную, maxEntries, stor-луг желаемый максимум. Его стоимость определена, когда объект Очков - первый довод «против» - structed. Чтобы отслеживать фактическое число записей, мы определяем членскую переменную numEntries. Это инициализировано к нолю, и это обновлено, поскольку записи добавлены или удалены. Мы предоставляем конструктору, печи для сжигания отходов производства, членской функции для добавления нового счета, и один для удаления счета в данном индексе. Определение дано в Кодовом Фрагменте 3.3.

Очки класса //хранит рекорды игры

общественность:

Очки (международный Maxent = 10);

//

конструктор

˜Scores ();

//

печь для сжигания отходов производства

пустота добавляет (константа GameEntry& e);

//

добавьте вход игры

GameEntry удаляют (интервал i)

//

удалите ith вход

бросок (IndexOutOfBounds);

частный:

интервал maxEntries; //максимальное количество интервала записей numEntries; //фактическое число записей GameEntry* записи; //множество записей игры

;

Кодовый Фрагмент 3.3: C ++ класс для хранения высоких очков игры.

В Кодовом Фрагменте 3.4, мы представляем конструктора класса, который ассигнует желаемую сумму хранения для множества, используя «нового» оператора. Вспомните из Раздела 1.1.3, что C ++ представляет динамическое множество как указатель на его первый элемент, и эта команда возвращает такой указатель. Печь для сжигания отходов производства класса, ~Scores, удаляет это множество.

Очки:: Очки (международный Maxent)

maxEntries = Maxent;

записи = новый GameEntry[maxEntries]; numEntries = 0;

// // // //

конструктор экономит макс. размер, ассигнуют хранение множества первоначально никакие элементы

Очки:: ˜Scores () //печь для сжигания отходов производства

удалите [] записи;

Кодовый Фрагмент 3.4: C ++ класс GameEntry, представляющий вход игры.

Записи, которые были добавлены ко множеству, сохранены в индексах 0 через

numEntries- 1. Поскольку больше пользователей играет в нашу видеоигру, дополнительные объекты GameEntry

106

Глава 3. Множества, Связанные Списки и Рекурсия скопированы во множество. Это сделано, используя класс, добавляет членская функция, которую мы описываем ниже. Только самые высокие maxEntries очки сохранены. Мы также обеспечиваем членскую функцию, удаляем (i), который удаляет вход в индексе i от множества. Мы предполагаем что£ £0 inumEntries- 1. В противном случае удалить функция,

бросает исключение IndexOutOfBounds. Мы не определяем это исключение здесь, но

это получено из класса RuntimeException от Раздела 2.4.

В нашем дизайне мы приняли решение заказать объекты GameEntry их ценностями счета от самого высокого до самого низкого. (В Упражнении C-3.2 мы исследуем альтернативный дизайн, в котором не заказаны записи.) Мы иллюстрируем пример структуры данных в рисунке 3.1.

Майк

Ограбить

Пол

Анна

Повысился

Джек

1105

750

720

660

590

510

0 1 2 3 4 5 6 7 8 9

Рисунок 3.1: множество записей длины восемь хранящих шести объектов GameEntry в

клетки от индекса 0 до 5. Здесь maxEntries равняется 10, и numEntries равняется 6.

Вставка

Затем, давайте рассмотрим, как добавить новый GameEntry e ко множеству рекордов. В частности давайте рассмотрим, как мы могли бы выполнить следующую операцию по обновлению на случае класса Очков.

добавьте (e): вход игры Вставки e в коллекцию рекордов. Если

это заставляет число записей превышать maxEntries, самое маленькое удалено.

Подход должен переместить все записи множества, очки которого меньше, чем счет e вправо, чтобы сделать пространство для нового входа. (См. рисунок 3.2.)

Джилл

740

Майк

Ограбить

Пол

Анна

Повысился

Джек

1105

750

720

660

590

510

0 1 2 3 4 5 6 7 8 9

Рисунок 3.2: Подготовка добавить новый объект GameEntry («Джилл», 740) к записям

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