更改std :: pair类型会影响hashmap

Tri*_* Vu -1 c++ stl stdmap std-pair

最初我的代码看起来像这样:

    std::map< std::pair<int,int>, std::vector<Class0*> > aMap;
Run Code Online (Sandbox Code Playgroud)

有效.现在我的代码看起来像这样:

    std::map< std::pair<Vec3f, Vec3f>, std::vector<Class0*> > aMap;
Run Code Online (Sandbox Code Playgroud)

它不再正确映射(编译正常).为什么?我该如何解决这个问题?

编辑:这里的流行需求是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]);

    }       ...
Run Code Online (Sandbox Code Playgroud)

从这个问题重载运算符集.上面的比较适用于一组,但显然不适合一对.为什么?

Chr*_*phe 6

地图的关键是一对.对的比较是词典:它首先比较两对的第一个元素.如果两者看起来相等,它也会比较第二个元素.所以,你需要两个适当比较Class1Class.

其他考虑因素

在该对的每个类中,小于的映射比较器必须符合一些约束:

  • 它必须在所有要素之间建立一种强烈的弱势.
  • (! k1<k2) && (! k2<k1) 相当于 k1==k2
  • k1<k2 && k2<k3 暗示 k1<k3

如果此属性中的任何一个被破坏,则无法保证严格的顺序,并且映射可能会失败.