Программирование >>  Дополнительные возможности наследования 

1 ... 201 202 203 [ 204 ] 205 206 207 ... 265


GrowingClass(3) after assigning students:

max size() = 214748364 size() = 3 capacityO = 3 not empty

New Student is 16 years old Sally is 15 years old Bill is 17 years old

GrowingClassO after added 4th student:

max size() = 214748364 sizeO = 4 capacityO = 6 not empty

New Student is 16 years old

Sally is 15 years old

Bill is 17 years old

Peter is 16 years old

GrowingClassO after Set:

max size() = 214748364 size() = 4 capacityO = 6 not empty

Harry is 18 years old Sally is 15 years old Bill is 17 years old Peter is 16 years old

Определение класса Student занимает строки 6-24, a выполнение его функций-членов показано в строках 26-66. Структура этого класса проста и дружественна по отношению к классу vector. По рассмотренным ранее причинам были определены стандартный конструктор, конструктор-копировщик и перефуженный оператор присваивания. Обратите внимание, что переменная-член itsName определена как экземпляр базового строкового класса С++ string. Как видите, со строками в С++ намного проще работать, подобное было в языке С (с типом char*).

Функция шаблона ShowVector() объявлена в строках 74-75 и определена в строках 115-128. Она используется для вызова функций-членов вектора, отображающих его свойства: max size(), size(), capacityO и emptyO. Насколько можно судить по результатам работы этой профаммы, максимальное число объектов класса Student, которое может принять этот вектор, в Visual C-f-f- составляет 214 748 364. Для других типов элементов это число может быть другим. Например, вектор целых чисел может вместить до 1 073 741 823 элементов. Если же вы используете другие компилеторы, то максимальное число элементов у вас может отличаться от приведенных здесь значений.

В Сфоках 124 и 125 выполняется цикл, опрашивающий все элементы вектора и отображающий их значения, используя оператор вывода ( ), который перефужен в строках 68-72.

В строках 81-84 создаются четыре объекта класса Student. В строке 86 с помощью стандартного консфуктора векторного класса определяется пустой вектор с именем EmptyClass. Когда вектор создается таким способом, то компилятор для него совсем не выделяет места в памяти. Как видно по результатам работы функции Show\/ector(EmptyClass), как размер, так и вместимость этого вектора равны нулю.

Строка 90 содержит определение вектора для включения трех объектов класса Student. Размер и вместимость этого вектора, как и ожидалось, равны трем. В строках 94-96 с помощью оператора индексирования ([]) элементы вектора GrowingClass заполняются объектами класса Student.

В Сфоке 100 к вектору добавляется четвертый студент (Peter). Это увеличивает размер вектора до четырех элементов. Интересно, что его вместимость теперь установлена равной шести. Это означает, что компилятор автоматически вьщелил доста-



точно пространства, которого хватит даже для шести объектов класса Student. Поскольку векторам должен быть вьщелен непрерывный блок памяти, для их расширения требуется выполнить целый ряд операций. Сначала выделяется новый блок памяти, достаточно большой для всех четырех объектов класса Student. Затем в только что выделенную память копируются эти три элемента, а четвертый добавляется после третьего элемента. И наконец, исходный блок памяти возврашается в область динамического обмена. При большом количестве элементов в векторе процесс перераспределения и освобождения памяти может оказаться весьма длительным. Поэтому в целях сокрашения вероятности выполнения таких дорогих (по времени) операций компилятор использует стратегию оптимизации. В данном примере, если сразу добавить к вектору еше один или два объекта, отпадает необходимость в дополнительных операциях, связанных с освобождением и перераспределением памяти.

В строках 104 и 105 вновь используется оператор индексирования ([]), чтобы изменить переменные-члены первого объекта в векторе GrowingClass.

Рекомвнддвшся

Определяйте стандартный конструктор для класса, если его объекты будут содержаться в векторе. Определяйте конструктор-копировщик для такого класса.

Рекомендуется

Определяйте для такого класса перегруженный оператор присваивания.

Класс-контейнер вектора имеет и другие функции-члены. Функция front() возвращает ссылку на первый элемент в списке, а функция Ьаск() - на последний. Функция at() работает подобно оператору индексирования ([]). Она более безопасна, поскольку проверяет, попадает ли переданный ей индекс в диапазон доступных элементов. Если адрес оказывается вне диапазона, эта функция генерирует исключение out of range. (Исключительные ситуации рассматриваются на следующем занятии.)

Функция insertO вставляет один или несколько узлов (элементов) в текущую позицию вектора. Функция Рор Ьаск() удаляет из вектора последний элемент. Наконец, функция removeO удаляет из вектора один или несколько элементов.

Сноспк

Список - это контейнер, разработанный для обеспечения оптимального выполнения частых вставок и удалений элементов.

Класс-контейнер библиотеки STL list определен в файле заголовка <list> в пространстве имен std. Класс list выполнен как двунаправленный связанный список, в котором каждый узел содержит указатели как на предьщущий, так и на последующий узел списка.

Класс list имеет все функции-члены, предоставляемые векторным классом. Как вы помните, список можно пройти, следуя по связям между узлами, реализованным с помощью указателей. Стандартный класс-контейнер list с той же целью использует алгоритм, называемый итератором.

Итератор - это обобщение указателя. Чтобы отыскать узел, на который указывает итератор, его нужно разыменовывать. Использование итераторов для доступа к узлам списка демонстрируется в листинге 19.9.



Листинг 19.9. Навигация по списку с помощьш итератора

flinclude <iostream> Winclude <list> using namespace std;

typedef list<int> IntegerList;

int mainO {

IntegerList intList;

for (int i = 1; 1 <= 10; ++1)

intList.push back(i * 2);

for (IntegerList;;const iterator ci = intList,begin();

ci != intList.end(); ++ci)

cout << *ci ; return 0;

щш,* 2 4 6 8 10 12 14 16 18 20

i В строке 9 объект intList определен как список целых чисел. В стро-**** ках 11 и 12 с помощью функции push back() в список добавляются первые 10 положительных четных чисел.

В строках 14-16 мы обращаемся к каждому узлу в списке, используя константный итератор. Константность указывает, что мы не собираемся изменять узлы с помошью этого итератора. Если бы мы хотели изменить узел, на который указывает итератор, пришлось бы использовать переменный итератор:

intList;:iterator

Функция-член begln() возвращает итератор на первый узел списка. Оператор инкремента (++) можно использовать для перехода к итератору следующего узла. Функция-член end(), что может показаться странным, возвращает итератор на узел, расположенный за последним узлом списка. Часто метод end() используют для определения допустимых границ списка.

Разыменование итератора (для возвращения связанного с ним узла) происходит аналогично разыменованию указателя, как показано в строке 16.

Хотя понятие итератора было введено только при рассмотрении класса list, итераторы можно использовать и с векторными классами. В дополнение к функциям-членам, с которыми вы познакомились в векторном классе, базовый класс списка тоже представляет функции push front() и pop front(), которые работают точно так же, как и функции push back() и рор Ьаск(). Но вместо добавления и удаления элементов в конце списка, они добавляют и удаляют элементы в его начале.



1 ... 201 202 203 [ 204 ] 205 206 207 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика