指定されたキーがコンテナー内に見つからなかったことを意味して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;
}