最初,我的代码看起来像这样:
std::map< std::pair<int,int>, std::vector<Class0*> > aMap;
有效。现在我的代码看起来像这样:
std::map< std::pair<Vec3f, Vec3f>, std::vector<Class0*> > aMap;
它不再正确映射(编译正常)。为什么?我该如何解决这个问题?
编辑:此后流行的需求是3D矢量(3个浮点数)的比较代码:
class Vec3f {
...
bool operator () ( const Vector3f& v0, const Vector3f& v1 ) const {
return std::tie(v0[0], v0[1], v0[2]) < std::tie(v1[0], v1[1], v1[2]);
} ...
来自这个问题Overloading operator for set。上面的比较适用于一组,但显然不适合一对。为什么呢?
答案 0 :(得分:6)
地图的关键是一对。 comparison of pair是词典:它首先比较两对的第一个元素。如果两者看起来相等,它也会比较第二个元素。因此,您需要对Class1
和Class
进行适当的比较。
其他注意事项:
在该对的每个类中,map comparator小于必须遵守一些约束:
(! k1<k2) && (! k2<k1)
相当于k1==k2
k1<k2 && k2<k3
表示k1<k3
如果此属性中的任何一个被破坏,则无法保证严格的顺序,并且映射可能会失败。