## 15.2 既存の標準ライブラリコンテナでのアロケータの使用

既存の標準 C++ ライブラリのコンテナクラスには、単純なプロセスでアロケータを使用することができます。コンテナをインスタンス化するときにアロケータ型を指定し、コンテナオブジェクトを作成するときに実際のアロケータオブジェクトを指定するだけです。

    my_allocator alloc<int>;               // アロケータを作成する
    vector<int,my_allocator<int> > v(alloc);    // アロケータを使用する

標準コンテナはすべて、`allocator<T>` をデフォルトのアロケータテンプレートパラメータ型に使用し、`Allocator()` をデフォルトのオブジェクトに使用します。この `Allocator` は、テンプレートパラメータ型です。つまり、アロケータの最も簡単な使用方法は、アロケータを完全に無視することです。アロケータを指定しなければ、すべての記憶管理にデフォルトのアロケータが使用されます。

テンプレートパラメータとして別のアロケータ型を指定する場合、指定するオブジェクトの型はテンプレートの型と一致している必要があります。たとえば、以下のコードは、テンプレート識別形式とアロケータコンストラクタの呼び出しの型が一致していないため、コンパイラエラーとなります。

    template <class T> class my_alloc;
    list <int, allocator<int> > my_list(my_alloc()); \\ Wrong!

以下のアロケータコンストラクタの呼び出しは、テンプレート識別形式と一致しています。

    list <int, my_alloc<int> > my_list(my_alloc());

アロケータテンプレートパラメータに使用される型と、標準コンテナの要素の型に使用される型も一致する必要があります。以下に例を挙げます。

    list<int, allocator<long>>

上記のコードは無効です。map に含まれる型は、実際にはキー値の対であることに注意してください。

    map<int,long,less<int>,allocator<pair<int,long>>>

コンテナには、コンストラクタに渡される allocator オブジェクトのコピーが必ず含まれることに注意してください。単一の allocator オブジェクトで複数コンテナのすべての記憶を管理する必要がある場合、共有実装への参照を維持する allocator を指定する必要があります。

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月