0

我对在 C++ 中使用地图非常陌生,因此在将它用于我的 SDL 表面时遇到了一些困难。这是我尝试过的(不工作):

map <SDL_Surface*, char*> mSurfaceMap;

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

这个想法是将所有表面及其相应的图像文件放在一个地图中,以便轻松地初始化它们并IMG_Load()对其进行操作,以及在关闭程序时释放它们。

如果这是一个不好的解决方案,请指出我正确的方向。我最初想制作两个数组,但我想试试这个,因为我觉得这是一个更优雅的解决方案。如果解决方案没问题,我很想听听我在代码中做错了什么。

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*> >可能就足以满足您的需要。

或者,如果您已经将表面存储为成员(假设从变量名称),那么您可以将成员变量存储为 atr1::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 回答