|
Программирование >> Операторы преобразования типа
Выделение памяти sizeElems = numElems = пиш; elems = alloc.allocate(nuni); Инициализация элементов uninit1ali2ed fni n (elems. num. val); Таблица 15.2. Вспомогательные функции для инициализации неинициализированной памяти Выражение Описание uninitialized rill(l:>eg, end, val) Инициализация интервала [l:>eg,end) значением val unlnitiallzed fill n(beg, num, val) Инициализация num элементов, начиная с beg, значением val unlnitialized copy(beg, end, mem) Инициализация элементов, начиная с mem, элементами интервала [beg,end) Функция reserveO, которая резервирует дополнительную память без изменения количества элементов (см. с. 158), может быть реализована так: namespace std ( template <class Т. class Allocator> void vector<T,Allocator>::reserve(size type size) Функция reserveO никогда не уменьшает объем памяти if (size <= sizeElems) { return; Выделение новой памяти для size элементов Т* newniefTi = alloc.allocate(size); Копирование старых элементов в новую память un1п i 11 а11zed copy(elems.е1ems+numE1 ems.newmem); Уничтожение старых элементов for (s1ze type 10; 1<numElems; ++1) ( alloc.destroy(&elems[1]); Освобождение старой памяти a11 ос.dea11 oca te(el ems.s1zeElems); Элементы находятся в новой памяти SizeElems = size: elems = newmem; Использование распределителей при программировании библиотек 705 Инициализирующий итератор Класс raw storage iterator предназначен для перебора неинициализированной памяти и ее инициализации. Итератор raw storagejterator может использовать любые алгоритмы для инициализации памяти значениями, полученными в результате выполнения алгоритма. Например, следующая команда инициализирует память, на которую ссылается указатель elems, значениями из интервала [x.begin(),x.end()); сору (x.begInO, x.endC), Источник raw storage 1terator<T*,T>{elems)); Приемник В первом аргументе шаблона (в данном случае Т*) должен передаваться итератор вывода для типа элементов. Второй аргумент шаблона (в данном случае Т) определяет тип элементов. Временные буферы Функции get temporary buffer() и return temporary buffer() работают с неинициализированной памятью, нредназначенной для краткосрочного использования внутри функции. Учтите, что функция get temporary buffer() может вернуть меньше памяти, чем ожидалось, поэтому она возвращает пару из адреса и размера памяти (в элементах). Пример использования этой функции: void f{) { Выделение памяти для num эленентов типа МуТуре pa1r<MyType*,std;:ptrdiff t> р = get temporary buffer<MyType>(num); If {p.second == 0) { Выделить память для элементов вообще не удалось else If (p.second < num) ( He удалось выделить достаточно памяти для num элементов, Однако и эту память нужно освободить! Обработка Освобождение временной выдепенной памяти If (p.first != 0) ( return temporary buffer(р.f1rst): Функции get temporary buffer() и retum temporary buffer() слишком сложны для написания безопасного с точки зрения исключений кода, поэтому обычно они не встречаются в библиотечных реализациях. Распределитель по умолчанию Распределитель по умолчанию объявляется следующим образом: namespace std { template <clas5 Т> class allocator ( public: Определения типов typedef size t size type; typedef ptrdiff t d1fference type: typedef T* pointer; typedef const T* const pointer; typedef T& reference; typedef const T& const reference; typedef T value type: Привязка распределителя к типу U template <c1ass U> struct rebind { typedef allocator<U> other: Функции возвращают адреса значений pointer address(reference value) const: const po1nter address(const reference value) const; Конструкторы и деструктор allocatorO throwO: allocatorCconst allocators) throwO; template <class U> allocatorCconst allocator<U>&) throwO; -allocatorO throwO; Функция возвращает максимальное количество элементов. АЛЯ которых может быть выделена память size type max size() const throwO; Выделение памяти для num злементов типа Т без инициализации pointer allocate(s1ze type num. allocator<VDld>::const polnter h1nt=0): Инициализация злементов выделенного блока р значением value void construct{po1nter p. const T& value);
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |