0

私は C++ でマップを使用するのに非常に慣れていないため、SDL サーフェスでマップを使用するのに苦労しています。これは私が試したものです(機能していません):

map <SDL_Surface*, char*> mSurfaceMap;

mSurfaceMap.insert(pair<SDL_Surface*, char*>(m_poSurfaceTest, "..//..//gfx//testImage.png"));

アイデアは、すべてのサーフェスとそれに対応する画像ファイルをマップに配置して、それらを簡単に初期化して処理しIMG_Load()、プログラムを閉じるときに解放することです。

これが悪い解決策である場合は、正しい方向に向けてください。最初は 2 つの配列を作成することを考えていましたが、よりエレガントなソリューションだと感じたので、代わりにこれを試してみました。解決策に問題がなければ、コードで何が間違っているのかを知りたいです。

4

2 に答える 2

0

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;
};
于 2011-03-30T17:52:17.077 に答える
0

このコードは私にとってはうまくいきます。出力は期待どおりです。

#include <map>
#include <stdio.h>

using std::map;
using std::pair;

struct Custom
{
    int val;
    Custom() {val=0;}
};

int main(int argC,char* argV[]) 
{
    map<Custom*,char*> mMap;
    Custom* test = new Custom;
    mMap.insert(pair<Custom*,char*>(test,"Test"));
    printf("%s\n",mMap[test]);
    return 0;
}
于 2011-03-30T17:59:35.373 に答える