|
Программирование >> Формирование пользовательского контейнера
II Конструирует элементы. for(size type i=0; i < sizeO; i++) a.construct(&arrayptr[i], t); Создает массив с отсчетом от нуля из num элементов со значением t. Этот конструктор необходим для совместимости с библиотекой STL. tenplate <class Т, class А> RangeArray<T, А>::RangeArray(int num, const T &t) { Сохраняет границы, upperbound = пглп; lowerbotind = 0; Выделяет память для контейнера, arrayptr = a,allocate(num) ; Сохраняет длину контейнера, len = num; Формирует элементы, for(size type i=0; i < sizeO; i++) a.construct(&arrayptr[i], t); Создает массив с отсчетом от нуля из диапазона итераторов. Этот конструктор необходим для совместимости с библиотекой STL. tenplate <class Т, class А> RangeArray<T, А>::RangeArray(iterator start, iterator stop) Выделяет требуемую память, arrayptr = a.allocate(stop - start); upperbotind = stop - start; lowerbound = 0; len = stop - start; Конструирует элементы, заданные диапазоном итераторов. for(size type 1=0; i < sizeO; i++) a.construct(&arrayptr[i], *start++); Копирующий конструктор, template <class T, class A> RangeArray<T, A>: :RangeArray (const RangeArray<T, A> &o) { Выделяет память для копии, arrayptr = а.allocate(о.size()); upperbotind = o.upperbotind; lowerbotind = o.lowerbotind; len = o.len; Создает копию. £or(size type i=0; i < sizeO; i++) a.construct(fiearrayptr[i], о.arrayptr[i]); Первый конструктор, установленный по умолчанию, создает пустой объект. Одно из требований, определенных в библиотеке STL, - результат вызова функции size о для объектз по умолчанию должен быть нулевым. Следовательно, конструктор, заданный по умолчанию, устанавливает верхнюю и нижнюю границы равными нулю. Он также обнуляет поле len и создает объект нулевой длины, используя функцию aiiocateo, предоставляемую распределителем памяти. Последние два шага гарантируют наличие полностью сформированного объекта во всех случаях. Второй конструктор - уникальный, специально разработанный для класса RangeArray. Он создает объект указанного диапазона с заданием начального значения для каждого элемента. Нижняя фаница указывается в первом па-рамефе, а верхняя - во втором. Обратите внимание на то, что генерируется исключение типа raexc, если верхняя фаница меньше или равна нижней. Третий параметр передает начальное значение элементов объекта. Таким образом, инсфукция RangeArray<char> ch(-2, 10, Х); создает массив символов с диапазоном индексов -2 до 10 и начальным значением каждого элемента, равным символу х. Массив размещается в памяти с помощью функции allocate о; члена класса allocator. Для большей гибкости контейнера следует использовать функции распределителя памяти а не операцию new для выделения памяти, необходимой контейнеру. После размещения массива формируется каждый его элемент, получая начальное значение, переданное в третьем параметре конструктора (хотя было бы удобнее опускать начальное значение, т. е. не задавать его каждый раз, подобное действие вызовет неоднозначность в третьем конструкторе, необходимом для совместимости с библиотекой STL). Формирование элементов выполняется с помощью функции construct о, еще одной функции распределителя памяти. Третий конструктор создает массив с нулевой нижней фаницей, состоящий из заданного числа элементов, инициализированных указанным начальным значением, которое можно опускать. Этот консфуктор не особенно полезен для класса RangeArray, НО трсбуется спецификацией контейнеров STL. Четвертый конструктор создает массив с нулевой нижней фаницей, используя заданный диапазон значений. Диапазон определяется передачей итераторов, указывающих на его начало и конец. Этот консфуктор также не особенно полезен для класса RangeArray, НО трсбустся спецификацией контейнеров STL. Последний, копирующий консфуктор выделяет память для нового объекта и затем копирует фаницы, длину и элементы исходного объекта. Таким образом, у копии имеется свой участок памяти, а в остальном она не отличается от оригинала. Далее приведен десфуктор класса RangeArray. Деструктор. tenplate <class Т, class А> RangeArray<T, А>::-RangeArray() Вызывает деструкторы для элементов в контейнере. for(size type i=0; i < sizeO; i++) a.des troy(&arrayptr[i]); Освобождает память. a.deallocate(arrayptr, size()); Прежде всего он уничтожает каждый элемент массива с помошью вызова функции destroyo. Далее освобождает память, отведенную массиву, с помощью функции распределителя памяти deaiiocateo.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |