在地图中保留和使用指向某些本地对象的指针可能非常危险。首先,std::map
当对象超出范围时,您可能会通过取消引用键来使您的应用程序崩溃。此外,它真的很难使用,而且在大多数情况下不是程序员想要的。在你的情况下:
auto it = mymap.find(&foo(2))
不会编译并且:
foo fc(2);
auto it = mymap.find(&fc);
不会在容器内找到任何值(fa
具有相同的值但指针不同)。真的是你想要的吗?
这就是为什么我会建议重新定义你std::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));
}