【问题标题】:Changing std::pair type affects hashmap更改 std::pair 类型会影响 hashmap
【发布时间】:2014-12-25 00:38:06
【问题描述】:

最初我的代码如下所示:

    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。上述比较适用于一组,但显然不适用于一对。为什么?

【问题讨论】:

  • “它不再正确映射(编译正常)”你能详细说明一下吗?预期和观察到的行为是什么?你能提供一个MCVE吗?
  • Class1 是否有正确的复制构造函数?
  • @TringVu 在您的实际问题中明确说明,而不是链接到另一个问题。甚至不要考虑将该链接编辑到您的问题中,提供完整的代码、错误消息以重现问题(不幸的是,您实际上比我做的更快)。
  • 你给我们看的是operator (),而不是operator &lt;...
  • --1 -- 在代码中使用...。有人要求制作 MCVE,而且很容易,但您选择不制作。这意味着我们必须确定问题是您的转录还是实际错误,

标签: c++ stl stdmap std-pair


【解决方案1】:

地图的关键是一对。 comparison of pair 是字典式的:它首先比较两对的第一个元素。如果两者看起来相等,它还会比较第二个元素。因此,您需要对Class1 和Class 进行适当的比较。

其他注意事项:

在对的每个类上,map comparator 小于必须遵守一些约束:

  • 它必须在所有元素之间建立严格的弱排序。
  • (! k1&lt;k2) &amp;&amp; (! k2&lt;k1) 等价于k1==k2
  • k1&lt;k2 &amp;&amp; k2&lt;k3 暗示 k1&lt;k3

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

【讨论】:

  • OP 修正了一个错字:没有Class,只有Class1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 2015-08-06
相关资源
最近更新 更多