|
Программирование >> Формирование пользовательского контейнера
Основные требования в контейнере распределение памяти предпочтительней выполнять с помошью распределителя памяти, а не операциями new и delete. Следовательно, контейнер должен использовать функции-члены распределителя памяти для выделения и очистки памяти. Распределитель задается как параметр при создании контейнера. В языке С++ есть класс-распределитель, заданный по умолчанию и названный allocator, и соответствующий параметр контейнера может указывать на объект этого типа, что и делают все стандартные контейнеры. Все распределители памяти должны предоставлять те же функции-члены, что и тип allocator (но, конечно, их реализация может быть разной). Таким образом, контейнер может использовать любой распределитель памяти, описанный профаммистом. Функции распределителя памяти, используемые контейнером, разрабатываемым в данной главе, приведены в табл. 8.1 Таблица 8.1. Функции распределителя памяти, используемые в этой главе Функция Назначение pointer allocate(size type nvm, typename allocator<void>::const pointer h = 0) ; void construct(pointer ptr, const reference val); void deallocate(pointer ptr, size type num); Void destroy(pointer ptr); size type max size() const throwO; Возвращает указатель на выделенный участок памяти, достаточный для хранения пит объектов типа т. Значение h служит подсказкой функции, которую можно использовать, для удовлетворения запроса, или игнорируется Создает объект типа т по адресу ptr Освобождает память, занятую пит объектами типа т, начиная с адреса ptr. Значение указателя ptr нужно получить из функции allocate О Уничтожает объект по адресу ptr. Автоматически вызывается его деструктор Возвращает максимальное число объектов типа т, которые можно разместить каждый контейнер должен поддерживать следующие типы: О iterator О const iterator О reference Дополнительные требования к последовательному контейнеру Помимо конструктора, заданного по умолчанию, и копирующего конструктора, последовательный контейнер должен предоставлять конструктор, создающий и инициализирующий указанное количество элементов. Кроме того, он должен иметь консфуктор, который создает и инициализирует объект при заданном диапазоне элементов. Далее перечислены варианты конструкторов, которые должен предоставлять последовательный контейнер. □ cnto □ Cnt{c) □ const reference □ value type □ size type □ difference type Реверсивный контейнер (поддерживающий двунаправленные итераторы) должен также предоставлять следующие типы: □ reverse iterator □ const reverse iterator Все контейнеры должны содержать заданный по умолчанию конструктор, создающий пустой контейнер, и копирующий конструктор. Необходимы также разные параметризованные конструкторы, точная форма которых различна у последовательных и ассоциативных контейнеров. Кроме того, требуется деструктор. Должны поддерживаться следующие функции-члены: begin О clear () emptyO end О erase О insert О max size() rbeginO rend О size О swapO Функции rbeginO и rendO нужны только в реверсивных контейнерах. Некоторые функции имеют перефуженные представления (overloaded forms). Примечание Во все встроенные контейнеры библиотеки STL включена функция get allocator (). но В пользовательских контейнерах ее наличия не требуется. Требование определить в контейнере функции итератора, такие как beginO, означает, что контейнер должен обеспечивать все операции, обязательные для итератора. Следующие операции должны поддерживаться всеми контейнерами: Cntinum. val) (У Cnt (start, end) При этом с - объект типа cnt; пит - целое, задающее счетчик; val - значение, совместимое с типом объектов, хранящихся в cnt; start и end - итераторы диапазона элементов, который будет использоваться при инициализации контейнера. В пользовательском контейнере можно определить дополнительные конструкторы. Примечание Конструкторы всех встроенных последовательных контейнеров библиотеки STL. за исключением копирующего конструктора, принимают аргумент, задающий распределитель памяти (по умолчанию типа allocator), но его указание не является обязательным требованием. В стандартном языке С++ определены следующие необязательные функции-члены для последовательных контейнеров: atО back О front() pop back() pcp front() push back push front() Операция индексирования [] также не обязательна. Безусловно, вы можете добавить другие функции-члены по своему усмотрению. Требования к ассоциативному контейнеру Во всех ассоциативных контейнерах следует определять следующие дополнительные типы: kex compare key type value compare Вместе с конструктором по умолчанию и копирующим конструктором ассоциативный контейнер должен предоставлять конструкторы, позволяющие определить функцию сопоставления или сравнения. Кроме того, следует определить конструктор, который создает и инициализирует объект, задавая диапазон элементов. Один вариант этого конструктора должен использовать функцию сопоставления, установленную по умолчанию, другой - разрешить пользователю определить собственную функцию сравнения. Далее перечислены варианты конструкторов, которые должны быть предоставлены. □ Cnt о О Cnt(с) о Cnt (СОЛ1Р) О Cnt (start, end) О Cnt(start, end, comp) Здесь с - объект типа cnt; start и end - итераторы диапазона элементов, который будет использоваться при инициализации контейнера; сотр - функция
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |