0
class foo{

public:
    int a, b, c;
    double val;

    foo(int a){
        ...
    }

...
}

今私はやりたい:

map <foo*, double> mymap;

foo fa(2);
foo fb(4);

mymap[fa] = 1.0;
mymap[fb] = 2.0;

明らかに、[ ] is undefined for type foo というエラーが表示されます。しかし、この演算子をオーバーロードするにはどうすればよいでしょうか? さらに言えば、foo へのポインターを取得するにはどうすればよいでしょうか。foo はカスタムクラスであるため、定義されていないと想定しているため

4

3 に答える 3

3

キーのタイプは である必要がありfoo*ます。したがって、これを書く必要があります:

mymap[&fa] = 1.0;
mymap[&fb] = 2.0;

ただし、とがローカル オブジェクトの場合 は、関数から戻ったときに破棄されることに注意してください。したがって、関数が戻ると、キーとして使用されるオブジェクトが存在しないため、関数から戻るべきではありません。fafbmymap

于 2012-11-18T18:43:35.497 に答える
1

ここでは何もオーバーロードする必要はありません。マップは へのポインターを想定してfooいるため、ポインターを に渡す必要がありますfoo。次のようにコードを修正できます。

mymap[&fa] = 1.0;
mymap[&fb] = 2.0;

fooオブジェクトがマップと同じかそれよりも長く存続することを絶対に確認する必要があることに注意してください。たとえば、これは涙で終わるでしょう:

map <foo*, double> mymap;

{
  foo fa(2);
  foo fb(4);
  mymap[&fa] = 1.0;
  mymap[&fb] = 2.0;
} // fa and fb cease to exist

// state of mymap is messed up here.
于 2012-11-18T18:42:40.367 に答える
0

マップ内の一部のローカル オブジェクトへのポインターを保持して使用することは、非常に危険な場合があります。まずstd::map、オブジェクトが範囲外になったときにキーを逆参照することで、アプリがクラッシュする可能性があります。さらに、それは本当に使いにくく、ほとんどの場合、プログラマーが意図したものではありません。あなたの場合:

auto it = mymap.find(&foo(2))

コンパイルされず、次のようになります。

foo fc(2);
auto it = mymap.find(&fc);

コンテナー内の値は見つかりません (fa値は同じですが、ポインターは異なります)。それは本当にあなたが望んでいたものですか?

そのため、値を保持して比較するためにyourstd::mapを再定義することをお勧めします。これを機能させるには、独自のソーリング アルゴリズムを実装するか、テンプレート引数として提供する必要があります。最初のケースは次のようになります。std::map<foo, double> mymap;foofoo::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));
}
于 2012-11-18T18:53:28.927 に答える