2014-12-05 5 views
1

Есть ли способ использовать пользовательский распределитель с картой карт?Карта карт и пользовательский распределитель

то есть, скажем, у меня есть:

typedef std::map<int,int> Inner; 
typedef std::map<int, Inner> Outer; 

Могу ли я иметь пользовательский распределитель для обоих?

Как это сделать, поскольку я не могу определить распределитель для внутренней карты в конструкторе внутренней карты?

для т.е. внешний я хотел бы сделать:

Allocator myAllocator; 
Outer outer(std::less<int>(), myAllocatorObject); 

Для внутренней ??

+0

Можете ли вы не написать распределитель для внешней «карты», в которой 'construct' определяет распределитель для внутренней' map'? (Я не пробовал лично, но это кажется перспективной перспективой). –

+0

Не уверен, что я понимаю, как это сделать. Пример? –

+0

Эта демонстрация делает что-то очень похожее на то, что вы описываете (поэтому он демонстрирует принцип, даже если вы на самом деле не хотите использовать boost): http://www.boost.org/doc/libs/1_57_0/doc/ html/interprocess/allocators_containers.html # interprocess.allocators_containers.containers_explained.containers_of_containers – jez

ответ

2

Это выглядит следующим образом:

typedef std::map<int, int, std::less<int>, SimpleAllocator<std::pair<const int, int>>> Inner; 
typedef std::map<int, Inner, std::less<int>, SimpleAllocator<std::pair<const int, Inner>>> Outer; 
Inner inner; 
Outer outer; 

Я пробовал некоторые примеры кода здесь, и это работает:

http://ideone.com/CuoaiQ


Очень хорошая версия римейк Джонатан Wakely:

http://ideone.com/wBtaks

+1

Шаблон псевдонима упрощает декларацию: http://ideone.com/wBtaks (Также ваши конструкторы распределителей не должны быть «явными», нет необходимости ставить 'inline' на члены, определенные в классе, а вы в том числе слишком много заголовков для этой программы. Также должно быть возможно сделать ваш распределитель намного проще, но ideone.com застрял в GCC 4.8, поэтому он там не работает) –

+0

ах, вы правы, я копирую-вставляю некоторые коды из моего проекта кода кода, так что он выглядит грязным. Спасибо за помощь! –

+0

Спасибо, что сработает. Но что, если я хочу самостоятельно инициализировать SimpleAllocator? –

Смежные вопросы