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;

显然我得到了 [ ] 对于类型 foo 未定义的错误。但是我如何重载这个操作符呢?就此而言,我如何获得指向 foo 的指针?因为我假设它没有定义,因为 foo 是一个自定义类

4

3 回答 3

3

密钥必须是 type foo*。所以你需要这样写:

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

但请记住,如果 fafb是本地对象,那么当您从函数返回时,它们将被销毁。所以你不应该mymap从函数中返回,因为一旦函数返回,用作键的对象就不存在了。

于 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具有相同的值但指针不同)。真的是你想要的吗?

这就是为什么我会建议重新定义你std::mapstd::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));
}
于 2012-11-18T18:53:28.927 回答