std::map順序付けられたキーでデータを検索するのに最適です。通常、O(log n) の検索時間を与えるバランスの取れたバイナリ ツリーとして実装されます。ルックアップの順序が問題にならない場合はstd::hash_map、O(1) のルックアップ時間で a を選択することをお勧めします。
いずれかのコンテナーでポインターをキーとして使用する際の問題は、ポインターの値ではなく、ポインターの整数アドレスによってインデックスが作成されることです。
std::stringただし、値のセマンティクスがあり、コンテナに文字列の値でインデックスを付ける小なり演算子を実装します。
メモリ管理のために、サーフェスをスマート ポインターに配置することもできます。
typedef std::tr1::shared_ptr<SDL_Surface> surface_pointer;
typedef pair<std::string, surface_pointer > surface_pair;
std::map<std::string, surface_pointer > mSurfaceMap;
mSurfaceMap.insert(surface_pair("..//..//gfx//testImage.png", surface_pointer(m_poSurfaceTest)));
他のいくつかの考え...
ルックアップ機能が必要なく、ハウスキーピングにコンテナーを使用しているだけの場合は、単純なstd::vector<std::pair<std::string, SDL_Surface*> >もので十分です。
または、すでにサーフェスをメンバーとして保存している場合 (変数名から推測)、メンバー変数を として保存できtr1::unique_ptr<SDL_Surface>、含まれているクラスが削除されると、SDL_Surfaceも削除されます。ただし、これを機能させるには、 のカスタム デアロケータを提供する必要があります。これによりtr1::unique_ptr、 を解放する方法が教えられますSDL_Surface*。
struct SdlSurfaceDeleter {
void operator() (SDL_Surface*& surface) {
if (surface) {
SDL_FreeSurface(surface);
surface = NULL;
}
}
};
次に、次のようにメンバーを指定します (typedef を使用すると冗長になりません)。
typedef std::tr1::unique_ptr<SDL_Surface, SdlSurfaceDeleter> surface_ptr;
class MyClass {
public:
MyClass(const std::string& path)
: m_poSurfaceTest(IMG_Load(path.c_str()) { }
surface_ptr m_poSurfaceTest;
};