Я учусь писать свой собственный распределитель прямо сейчас и пытаюсь реализовать его с помощью некоторых контейнерных классов.Проблема в том, что я не совсем понимаю, как распределитель работает с контейнером List.
По сути, я попытался создать очень простой Allocator и List Class для запуска и запуска.Что я понимаю до сих пор, так это то, что повторное связывание позволит мне выделить мои списочные узлы.Выделение и освобождение позволят мне выделить память и вернут указатель на эту память. И конструирование и уничтожение будут создавать экземпляры в выделенной памяти и вызывать деструкторы для определенного объекта.
- Как сделатьЯ вызываю повторное связывание, чтобы оно выделяло мои ListNodes?
- Нужно ли иметь объект Allocator в моем классе List?
- Буду ли я вызывать свои функции выделения и конструирования в моем конструкторе списков, а также деаллоки и деструкторы для моего деструктора списков?
- Кроме того, может ли кто-нибудь уточнить, почему структура повторного связывания позволила бы мне выделить для списков узлов?Там только typedef, так что я не совсем понимаю, как это произойдет.
Не стесняйтесь добавлять любую другую информацию о распределителях, которую вы можете сэкономить мне, пожалуйста.
Любая помощь приветствуется.Спасибо.
template <class T>
class Allocator{
public:
typedef T value_type;
typedef T* pointer;
typedef size_t size_type;
typedef T& reference;
template<class Other>
struct rebind{
typedef Allocator<Other> other_type;
};
Allocator();
~Allocator();
pointer allocate(size_type n){
pointer p = ::operator new(n*sizeof(T));
return p;
};
void deallocate(pointer p){
::operator delete(p);
return;
};
void construct(pointer p, reference value){
new(p) T(value);
return;
};
void destruct(pointer p){
p->~T();
return;
}
}; // class Allocator
template<class T>
class ListNode<T>{
private:
T val;
ListNode<T>* next;
public:
ListNode():val(NULL),next(NULL){};
~ListNode(){};
}; // class ListNode
template<class T, class Alloc = memory::Allocator<T>>
class List{
private:
ListNode<T> *head;
ListNode<T> *tail;
typedef Alloc<T> A;
public:
typedef T value_type;
typedef T* iterator;
typedef T& reference;
List(){};
~List(){};
void insert(T data);
//.... other random functions etc
}; // class List