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

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

Как только мы определили положение во множестве записей где новая игра

вход, e, принадлежит, мы копируем e в это положение. (См. рисунок 3.3.)

Майк

Ограбить

Джилл

Пол

Анна

Повысился

Джек

1105

750

740

720

660

590

510

0 1 2 3 4 5 6 7 8 9

Рисунок 3.3: После добавления нового входа в индексе 2.

Детали нашего алгоритма для добавления нового входа игры e ко множеству записей подобны этому неофициальному описанию и даны в Кодовом Фрагменте 3.5. Во-первых, мы рассматриваем, полно ли множество уже. Если так, мы проверяем ли счет

последний вход во множестве (который является при записях [maxEntries- 1]), по крайней мере, как большой

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

любые из существующих самых высоких очков. Если множество еще не полно, мы знаем, что один новый вход будет добавлен, таким образом, мы увеличим ценность numEntries. Затем, мы определяем все записи, очки которых меньше, чем e's и перемещают их один вход вправо. Чтобы избежать переписывать существующие записи множества, мы начинаем с правильного конца множества и работы налево. Петля продолжается, пока мы не сталкиваемся с входом, счет которого не меньше, чем e's, или мы падаем с фронтенда множества. В любом случае новый вход добавлен в индексе i + 1.

недействительные Очки:: добавьте (константа GameEntry& e)//добавляют вход игры

интервал newScore = e.getScore (); //выигрывают, чтобы добавить

если (numEntries == maxEntries) //множество полно

если (newScore <= записи [maxEntries-1] .getScore ())

возвратитесь; //не достаточно высоко - игнорируют

еще numEntries ++; //, если не полный, еще один вход

интервал i = numEntries-2; //начинаются с рядом с в последний раз

в то время как (i> = 0 && newScore> записи [я] .getScore ())

записи [i+1] = записи [я]; //перемещают право, если меньший

i-;

записи [i+1] = e; //помещает e в пустое пятно

Кодовый Фрагмент 3.5: C ++ кодируют для вставки объекта GameEntry.

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

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

Удаление объекта

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

удалите (i): Удалите и возвратите вход игры e в индексе i в

множество записей. Если индекс, который я вне границ множества записей, то эта функция бросает исключение; oth-erwise, множество записей обновлено, чтобы удалить Обь - ject в индексе i и всех объектах, ранее хранивших в индексах выше, чем я «перемещен оставленный», чтобы заполнить для удаленного объекта.

Наше внедрение удаляет, подобно тому из, добавляют, но наоборот. Чтобы удалить вход в индексе i, мы начинаем в индексе i и перемещаем все записи в индексы выше, чем я одно положение налево. (См. рисунок 3.4.)

Возвращение: Пол

720

Майк

Ограбить

Джилл

Анна

Повысился

Джек

1105

750

740

660

590

510

0 1 2 3 4 5 6 7 8 9

Рисунок 3.4: Удаление входа («Пол», 720) в индексе 3.

Кодекс для выполнения удаления представлен в Кодовом Фрагменте 3.6.

Очки GameEntry:: удалите (интервал i) бросок (IndexOutOfBounds)

если ((я <0) (i> = numEntries))

//недействительный индекс

бросьте IndexOutOfBounds («Недействительный индекс»);

GameEntry e = записи [я]; для (интервал j = i+1; j <numEntries; j ++)

записи [j-1] = записи [j];

numEntries-;

возвратите e;

//спасите удаленный объект

//записи изменения, оставленные//один меньше входа//, возвращают удаленный объект

Кодовый Фрагмент 3.6: C ++ кодируют для выполнения удалить операции.