2011-12-05 18 views
2

私はエンジンのイメージハンドラを作成しています。これまでのところかなり良い(私は思う)が、私は画像を削除すると助けが必要です。私はvectorの経験がありますが、mapではありません。イメージハンドラクラスのstd :: mapヘルプ

std::map<std::string, SDL_Surface*> image_list_; 
std::map<std::string, SDL_Surface*>::iterator it; 

その後、私は2つの私のImageHandlerクラスのメソッドがあります:ここで

void AddImage(std::string/*file_name*/); 
void DeleteImage(std::string/*file_name*/); 

をこれらの2つの方法の根性ある

画像ハンドラは、2つの要素を持っているのstd ::マップを持っています:

bool ImageHandler::AddImage(std::string file_name) 
{ 
    SDL_Surface* temp = NULL; 
    if ((temp = Image::Load(file_name)) == NULL) 
     return false; 
    image_list_.insert(std::pair<std::string, SDL_Surface*>(file_name, temp)); 
    SDL_FreeSurface(temp); 
    return true; 
} 

bool ImageHandler::DeleteImage(std::string file_name) 
{ 
    if (image_list_.empty()) return; 
    it = image_list_.find(file_name); 
    if (!it) return false; 
    image_list_.erase(it); 
    return true; 
} 

私はこのコードをコンパイルしていないので、構文エラーは認識していません。存在するものがあれば、過去のものを見ることができます。

私は私のDeleteImage方法がmapから削除されますが、それは私がこれを行うために必要な画像をロードするとき、メモリリークを避けるためにと思う:

SDL_FreeSurface(SDL_Surface*); 

だから私は、私はイテレータのにアクセスする必要があると思います要素を特定のマップインデックスに追加します。これまでのところ私はそれをやっていますか?これをどうすればできますか?

+0

SDL_FreeSurface(IT->秒)。 image_list_.erase(it); – Jagannath

答えて

1

:機能するであろう

bool ImageHandler::DeleteImage(std::string const & file_name) 
{ 
    if ((it = image_list_.find(file_name)) == image_list_.end()) 
    { 
    return false; 
    } 

    SDL_FreeSurface(it->second); 
    image_list_.erase(it); 
    return true; 
} 
+0

質問があります。the_map_ [0] .secondのようなインデックスでマップの2番目の要素を取得するにはどうすればよいですか? – evolon696

+0

@sikesusmc:私はその質問を理解していません。マップには「インデックス」はなく、むしろ「キー」を持っています。そして 'm [" hello "]'は既にキー "hello"を持つエントリのマップされた値*です。 (あるいは、要素が存在すると仮定すると 'm.find(" hello ") - > second')。 –

+0

oh。私はどのように数字のマップの2番目の要素を取得するのだろうか?配列や何かのように。 []演算子を使用しないでください。 – evolon696

1

はいあなたは正しい、あなたはマップからそれを消去前

SDL_FreeSurface(it->second); 

を行うだろう。このよう

bool ImageHandler::DeleteImage(std::string file_name) 
{ 
    if (image_list_.empty()) return; 
    it = image_list_.find(file_name); 
    if (!it) return false; 
    SDL_FreeSurface(it->second); 
    image_list_.erase(it); 
    return true; 
} 
関連する問題