Реализация собственного распределителя для std::map, чтобы оператор возвращал указатели на объекты.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Реализация собственного распределителя для std::map, чтобы оператор возвращал указатели на объекты.

Сообщение Anonymous »

Мне нужно использовать собственную реализацию пула HybridPoolDynamic, чтобы ограничить емкость std::map, а также создавать и распределять объекты.
Этот класс может выделить и создать объект, вызвав allocObj(), а также разрушить и освободить его с помощью freeObj().
Требование состоит в том, чтобы при переборе карты Я получу указатель на объекты, а не на сами объекты. Поэтому я попробовал разместить внутри распределителя два пула: один с объектами, другой с указателями.
Это моя пробная версия:

Код: Выделить всё

template 
class HybridPoolAllocator : public std::allocator{
public:
HybridPoolAllocator(const unsigned int minStackAllocation, const unsigned int maxHeapCapacity):
_pairPool("HybridPairsPoolAlocatorObjmContainer",minStackAllocation,maxHeapCapacity),
_dataPool("HybridDataPoolAlocatorObjmContainer",minStackAllocation,maxHeapCapacity){}
std::pair* allocate(){
T* obj = _dataPool.allocObj();
std::pair* pair = _pairPool.allocObj();
pair->second = obj;
return pair;
}
void deallocate(std::pair* pair){
_dataPool.freeObj(pair->second);
_pairPool.freeObj(pair);
}
protected:
HybridPoolDynamic _pairPool;
HybridPoolDynamic _dataPool;
};
И я использую следующую реализацию:

Код: Выделить всё

typedef  std::map< int,
T*,
std::less,
HybridPoolAllocator > ObjectMap;
ObjectMap myMap;
myMap[0];
Я ожидал, что последняя строка создаст объект T по умолчанию, однако код не достигает точки останова внутри метода allocate(). Думаю, я не реализую для этого правильную подпись?
Учитывая класс HybridPoolDynamic с allocObj() и freeObj() как мне реализовать собственный распределитель, чтобы при выделении использовался заданный класс, итератор возвращал указатели на объекты, а не на сами объекты, и как мне создать элемент по умолчанию с помощью этого распределителя?

Подробнее здесь: https://stackoverflow.com/questions/787 ... -will-retu
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»