Главная arrow Программирование С++ arrow Определения требуемых типов

Определения требуемых типов

За описанием членов класса с уровнем доступа private следуют приведенные далее различные определения со спецификатором typedef, обязательные для всех последовательных контейнеров. // Спецификаторы typedef, необходимые для контейнера, typedef Т value_type; typedef Allocator allocator_type; typedef typename Allocator::reference reference; typedef typename Allocator::const_reference const_reference; typedef typename Allocator::size_type size_type;   . typedef typename Allocator::difference_type difference_type; typedef typename Allocator::pointer pointer; typedef typename Allocator::const_pointer const_pointer;
// Итераторы прямого направления.
typedef T * iterator;
typedef const T * const_iterator;
1
Эти определения подобны применяемым во встроенных контейнерах библиотеки STL. Обратите внимание на то, что итераторы прямого направления — это просто указатели на объекты типа т. Для класса RangeArray этого достаточно, но могут быть более сложные контейнеры. Кроме того, не предусмотрены итераторы обратного направления, вы можете попробовать добавить их.
Конструкторы и деструктор класса RangeArray
Для увеличения гибкости создаваемого контейнера следует в его описание включить описанные ранее четыре варианта конструкторов, предусмотренных для последовательных контейнеров. В классе RangeArray также описан пятый конструктор, позволяющий создавать массив заданного диапазона. Далее приведено описание конструкторов. // Конструктор, заданный по умолчанию. RangeArray () {
upperbound = lowerbound = 0; len = 0;
arrayptr = a.allocate(O);
}
// Конструирует массив заданного диапазона
// с указанием начального значения каждого элемента.
template <class Т. class А>
RangeArray<T, А>::RangeArray(int low, int high, const T &t)
{
if(high <= low) throw RAExc("Invalid Range"); high++;
// Сохраняет границы, upperbound = high; lowerbound = low;
// Выделяет память для контейнера, arrayptr = a.allocate(high - low);
// Сохраняет длину контейнера, len = high - low;
II Конструирует элементы, for(size_type i=0; i < sizeO; i++) a.construct(&arrayptr[i], t);
}
// Создает массив с отсчетом от нуля из num элементов // со значением t. Этот конструктор необходим // для совместимости с библиотекой STL.
template <class Т, class А>
RangeArray<T, А>::RangeArray(int num, const T &t)  {
// Сохраняет границы, upperbound = num; lowerbound = 0;
// Выделяет память для контейнера, arrayptr = a.allocate(num);
// Сохраняет длину контейнера, len = num;
// Формирует элементы, for(size_type i=0; i < sizeO; i++) a.construet(fcarrayptr[i], t);
)
// Создает массив с отсчетом от нуля из диапазона итераторов. // Этот конструктор необходим для совместимости с библиотекой STL. template <class Т, class А> RangeArraycT, А>::RangeArray(iterator start, iterator stop)
{
// Выделяет требуемую память, arrayptr = a.allocate(stop - start);
upperbound = stop - start; lowerbound = 0;
len = stop - start;
// Конструирует элементы, // заданные диапазоном итераторов, for(size_type i=0; i < sizeO; i++) a.construct(&arrayptr[i], *start++);
}
// Копирующий конструктор, template <class T, class A>
RangeArraycT, A>::RangeArray"(const RangeArraycT, A> &o) {
// Выделяет память для копии, arrayptr = а.allocate(о.size());
upperbound = о.upperbound; lowerbound = о.lowerbound; len = o.len;
// Создает копию.
for(size_type i=0; i < sizeO; i++)
a.construet(&arrayptr[i], о.arrayptr[i]);
}
Первый конструктор, установленный по умолчанию, создает пустой объект. Одно из требований, определенных в библиотеке STL, — результат вызова функции size о для объекта по умолчанию должен быть нулевым. Следовательно, конструктор, заданный по умолчанию, устанавливает верхнюю и нижнюю границы равными нулю. Он также обнуляет поле len и создает объект нулевой длины, используя функцию aiiocateo, предоставляемую распределителем памяти. Последние два шага гарантируют наличие полностью сформированного объекта во всех случаях.
Второй конструктор — уникальный, специально разработанный для класса RangeArray. Он создает объект указанного диапазона с заданием начального значения для каждого элемента. Нижняя граница указывается в первом параметре, а верхняя — во втором. Обратите внимание на то, что генерируется исключение типа RAEXC, если верхняя граница меньше или равна нижней. Третий параметр передает начальное значение элементов объекта. Таким образом, инструкция RangeArray<char> ch(-2, 10,  'X');
создает массив символов с диапазоном индексов —2 до 10 и начальным значением каждого элемента, равным символу х. Массив размещается в памяти с помощью функции allocate о; члена класса allocator. Для большей гибкости контейнера следует использовать функции распределителя памяти а не операцию new для выделения памяти, необходимой контейнеру. После размещения массива формируется каждый его элемент, получая начальное значение, переданное в третьем параметре конструктора (хотя было бы удобнее опускать начальное значение, т. е. не задавать его каждый раз, подобное действие вызовет неоднозначность в третьем конструкторе, необходимом для совместимости с библиотекой STL). Формирование элементов выполняется с помощью функции construct о, еще одной функции распределителя памяти.
Третий конструктор создает массив с нулевой нижней границей, состоящий из заданного числа элементов, инициализированных указанным начальным значением, которое можно опускать. Этот конструктор не особенно полезен для класса RangeArray, но требуется спецификацией контейнеров STL.
Четвертый конструктор создает массив с нулевой нижней границей, используя заданный диапазон значений. Диапазон определяется передачей итераторов, указывающих на его начало и конец. Этот конструктор также не особенно полезен для класса RangeArray, но требуется спецификацией контейнеров STL.
Последний, копирующий конструктор выделяет память для нового объекта и затем копирует границы, длину и элементы исходного объекта. Таким образом, у копии имеется свой участок памяти, а в остальном она не отличается от оригинала.
Далее приведен деструктор класса RangeArray.
// Деструктор.
template <class T, class А>
RangeArraycT, А>::-RangeArray()
{
// Вызывает деструкторы для элементов в контейнере. for(size_type i=0; i < sizeO; i++) a.des troy(&arrayptr[i]);
// Освобождает память.
a.deallocate(arrayptr, size());
}
Прежде всего он уничтожает каждый элемент массива с помощью вызова функции destroyo. Далее освобождает память, отведенную массиву, с помощью функции распределителя памяти deaiiocateo.
упоминаю, что конструкторы класса RangeArray не применяют операцию new ДЛЯ выделения памяти, а деструктор — операцию delete для ее очистки. Вместо этого они используют функции-члены распределителя памяти. Такой подход позволяет пользователю задавать альтернативные средства управления памятью, отведенной контейнеру.
 
монтаж и изготовление металлоконструкций, оптовая торговля крупами