Как распределители и перепривязки работают с контейнерами? - PullRequest
0 голосов
/ 28 января 2019

Я учусь писать свой собственный распределитель прямо сейчас и пытаюсь реализовать его с помощью некоторых контейнерных классов.Проблема в том, что я не совсем понимаю, как распределитель работает с контейнером 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...