ショートバージョン
次のようなマップ タイプ:
typedef std::map<
int,
int,
less<int>,
boost::pool_allocator<pair<const int, int> >
>
AMapType;
boost::pool_allocators を使用して、成長するにつれて必要なすべての割り当てを行います。初期構造の一部は、スタック上に作成される可能性があります。ただし、正確な構造がどの程度であるかは、実装に依存します。
アロケーターの再バインド
上記は、を使用することで可能ですallocator::rebind
すべての std::allocator 準拠アロケーター (boost::pool_allocator など) は、次の形式で rebind テンプレート構造体を提供します。
template<class U> struct rebind{
typedef AllocatorType<U> other;
};
これを使用して、異なるタイプの同じ種類のアロケーターを取得できます。
typedef AllocatorOfOther AllocatorType::rebind<ADifferentType>::other;
gcc std::map 内部構造
g++ std::map 実装 (私は 4.7.3 と 4.1.1 を調査しました) は、純粋に単一のノード タイプから構築されています。これには、rbTree 構造に必要なキーと値のペア、ポインター、およびカラー ビットが含まれます。これを割り当てるために、ユーザー提供のアロケーターから rebind 構造体を使用してノード アロケーターを定義します。これは、マップが大きくなるにつれて行われるすべての割り当てに使用されます。新しいノードはそれぞれ、単一の割り当てで割り当てられます。
標準
私は C++11 標準をチェックしましたが、そのような構造をどのように割り当てるかを指定するものは見つかりませんでした。適切な部品が見つからなかったか、指定されていません。ただし、ユーザー指定のアロケーターの種類を使用しないのは、少し無意味に思えます。