マップ内の一部のローカル オブジェクトへのポインターを保持して使用することは、非常に危険な場合があります。まずstd::map
、オブジェクトが範囲外になったときにキーを逆参照することで、アプリがクラッシュする可能性があります。さらに、それは本当に使いにくく、ほとんどの場合、プログラマーが意図したものではありません。あなたの場合:
auto it = mymap.find(&foo(2))
コンパイルされず、次のようになります。
foo fc(2);
auto it = mymap.find(&fc);
コンテナー内の値は見つかりません (fa
値は同じですが、ポインターは異なります)。それは本当にあなたが望んでいたものですか?
そのため、値を保持して比較するためにyourstd::map
を再定義することをお勧めします。これを機能させるには、独自のソーリング アルゴリズムを実装するか、テンプレート引数として提供する必要があります。最初のケースは次のようになります。std::map<foo, double> mymap;
foo
foo::operator<()
std::map
class foo {
int a, b, c;
double val;
public:
foo(int a) {}
bool operator<(const foo &other) const
{ return a < other.a && b < other.b && c < other.c; }
};
int main()
{
std::map<foo, double> mymap;
foo fa(2);
foo fb(4);
mymap[fa] = 1.0;
mymap[fb] = 2.0;
auto it = mymap.find(foo(2));
}