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

232 Глава 6. Список и Iterator adTs

A A

B B A

(a) (b) (c)

Рисунок 6.2: три шага для «роста» растяжимого множества: (a) создают новую площадь -

луч B; (b) копируют элементы от до B; (c) повторно поручают относиться к новому множеству и удалять старое множество.

Наше определение класса отличается немного от операций, данных в нашем ADT. Например, мы обеспечиваем два средства для доступа к отдельным элементам вектора. Первое включает отвержение C ++ оператор индекса множества (» []»), и второе в функции. Две функции ведут себя то же самое, за исключением того, что в функции выполняет тест диапазона перед каждым доступом. (Отметьте подобие с векторным классом STL, данным в Разделе 6.1.4.), Если индекс я не нахожусь в границах, эта функция бросает исключение. Поскольку обе из этих операций по доступу возвращают ссылку, нет никакой потребности явно определить функцию множества. Вместо этого мы можем просто использовать оператора назначения. Например, ADT функционируют v.set (я, 5) мог быть осуществлен или как v [я] = 5 или, более безопасно, как v.at (i) = 5.

Элемент интервала typedef; //базируют тип элемента

класс ArrayVector

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

ArrayVector (); //размер интервала конструктора () константа; //ряд элементов bool пустой () константа; //действительно ли вектор пуст? Elem& оператор [] (интервал i); //el ement во мне ndex

Elem& в (интервал i) бросок (IndexOutOfBounds);//элемент в индексе

пустота стирает (интервал i); недействительная вставка (интервал i, константа Elem& e); недействительный запас (интервал N);//... (вспомогательные опущенные функции)

частный:

международная способность; интервал n; Элемент* A;

;

//удалите элемент в индексе//элемент вставки в индексе//запас, по крайней мере, N пятна

//текущий размер множества//ряд элементов в векторе//множество, хранящее элементы

Кодовый Фрагмент 6.2: векторное внедрение, используя растяжимое множество.

Членские данные для класса ArrayVector состоят из хранения множества A, текущий номер n элементов в векторе и текущая вместимость. Класс ArrayVector также обеспечивает функции ADT, вставляет и удаляет. Мы обсуждаем их внедрения ниже. Мы добавили новую функцию, вызванную запас, это

6.1. Векторы 233

не часть ADT. Эта функция позволяет пользователю явно просить что

выстройте быть расширенными до способности размера, по крайней мере, n. Если способность уже больше, чем это, то функция ничего не делает.

Даже при том, что мы не потрудились показывать им, класс также обеспечивает некоторые стандартные вспомогательные функции. Они состоят из конструктора копии, оператора назначения и печи для сжигания отходов производства. Поскольку этот класс ассигнует память, их включение важно для полного и прочного внедрения класса. Мы оставляем их как упражнение (R-6.6). Мы должны также добавить версии операторов индексации, которые возвращают постоянные ссылки.

В Кодовом Фрагменте 6.3, мы представляем конструктора класса и много простых членских функций. Когда вектор построен, мы не ассигнуем хранения и просто устанавливаем в ПУСТОЙ УКАЗАТЕЛЬ. Обратите внимание на то, что первая попытка добавить элемент приводит к ассигнуемому хранению множества.

ArrayVector:: ArrayVector ()

: способность (0), n (0), (ПУСТОЙ УКАЗАТЕЛЬ)международный ArrayVector:: размер () константа

возвращают n;bool ArrayVector:: пустой () константа

возвращают размер () == 0;Elem& ArrayVector:: оператор [] (интервал i)

возвращаются [я];

//конструктор

//ряд элементов

//действительно ли вектор пуст?

/ / el ement во мне ndex

//элемент в (безопасном) индексе

Elem& ArrayVector:: в (интервал i) бросок (IndexOutOfBounds)

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

бросьте IndexOutOfBounds («незаконный индекс в функции в ()»);

возвратитесь [я];

Кодовый Фрагмент 6.3: простой участник функционирует для класса ArrayVector.

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

выше, это удаляет элемент в индексе i, перемещая все последующие элементы от индекса i + 1 к последнему элементу множества вниз одним положением.

недействительный ArrayVector:: сотрите (интервал i)

для (интервал j = i+1; j <n; j ++)

[j- 1] = [j];

n-;

//удалите элемент в индексе//элементы изменения вниз

//один меньше элемента

Кодовый Фрагмент 6.4: членская функция удаляет для класса ArrayVector.

234