std::map
отлично подходит для поиска данных по упорядоченному ключу, обычно он реализован в виде сбалансированного двоичного дерева, которое дает O (log n) время поиска.Если порядок поиска не имеет значения, тогда std::hash_map
будет лучшим выбором с временем поиска O (1).
Проблема с использованием указателя в качестве ключа в любом контейнеречто они будут индексировать по целочисленному адресу указателя, а не по значению того, на что указано.
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;
};