0

私は次のようにstd::map定義しています

typedef std::map<string,ImageData*> ImageDataMap;
typedef std::pair<string,ImageData*> ImageDataPair;
typedef std::map<string,ImageData*>::iterator ImageDataIterator;

上記のマップには、画像ファイル名とImageData画像メタデータである文字列が格納されます。以下に示すように検索を使用すると

ImageDataIterator iter =  imageMap->find("Fader.tga");
if(iter == imageMap->end()){...}

これiter->firstは badptr であるため、以下の if 条件に失敗します。ここで何が問題なのですか?xp64 の vc9 Express Edition で実行 (プログラムは 32 ビット)

4

2 に答える 2

3

指定されたキーがコンテナー内に見つからなかったことを意味してmap::end返された反復子。map::find()その要素にアクセスするために逆参照することはできません。アプリケーションがクラッシュします。

編集:

はっきりさせましょう。問題は、ロジックを反転させていることです。有効な場合にのみイテレータを使用できるため、iterとは異なる必要がありますmap::end。これは、それmap::find()が成功し、探していた要素が見つかったことを意味します。

if (iter != imageMap->end())
{
  // element FOUND! Use it!
  cout << iter->first << endl;
}
else
{
  // Not found! Can't use it.
}

あなたの間違いは、現在行っているif比較です。つまり、検索した要素がマップにない場合は、次のコード ブロックを実行することif (iter == imageMap->end())を意味します。そのため、を実行するとアプリケーションが壊れます。iter->first

#include <iostream>
#include <map>
#include <string>

typedef int ImageData;
typedef std::map<std::string,ImageData*> ImageDataMap;
typedef std::map<std::string,ImageData*>::iterator ImageDataIterator;


using namespace std;


int main()
{
  ImageDataMap mymap;

  int value_1 = 10;
  int value_2 = 20;
  int value_3 = 30;

  mymap["a"] = &value_1;
  mymap["b"] = &value_2;
  mymap["c"] = &value_3;

  // Search/print valid element
  ImageDataIterator it = mymap.find("a");
  if (it != mymap.end()) // will execute the block if it finds "a"
  {          
      cout << it->first << " ==> " << *(it->second) << endl;
  }

  // Searching for invalid element
  it = mymap.find("d"); // // will only execute the block if it doesn't find "d"
  if (it == mymap.end())
  {
    cout << "!!! Not found !!!" << endl;
    cout << "This statement will crash the app" << it->first << endl;;
  }

  cout << "Bye bye" << endl;

  return 0;
}
于 2011-04-01T23:27:27.543 に答える
0

おそらくあなたはに変更if(iter == imageMap->end()){...}する必要がありますif(iter != imageMap->end()){...}

于 2011-04-02T00:10:35.207 に答える