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;
};