4

我有一个复杂的结构,我想将其作为 std::map 的键,以快速列出所有唯一对象:

union somecomplexstruct {
     struct {
        more_structs val1, val2;
        even_more_structs val3, val4;
        lots_of_more_structs val5;
     };
     unsigned int DATA[3];
};

typedef map<somecomplexstruct, int, greater<somecomplexstruct> > somecomplexstructMap;

但它说错误:error C2784: 'bool std::operator >(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)' : could not deduce template argument for 'const std::vector<_Ty,_Alloc> &' from 'const somecomplexstruct'

我如何让我的结构在那里工作?

编辑:得到它的工作,谢谢大家!继承人的代码:

inline bool operator>(const somecomplexstruct &v1, const somecomplexstruct &v2){
    if(v1.DATA[0] > v2.DATA[0]) return 1;
    if(v1.DATA[0] < v2.DATA[0]) return 0;
    if(v1.DATA[1] > v2.DATA[1]) return 1;
    if(v1.DATA[1] < v2.DATA[1]) return 0;
    return v1.DATA[2] > v2.DATA[2];
}
4

4 回答 4

9

std::greater<>调用operator>()来完成它的工作,所以如果你想使用std::greater<>.

它应该如下所示:

inline bool operator>(const somecomplexstruct& lhs, const somecomplexstruct& rhs)
{
  // implement your ordering here. 
}
于 2010-10-29T14:27:40.977 回答
3

使用您的函数,考虑比较和operator>会发生什么。如果你比较,它会从第一次比较中返回 true。如果进行比较,则从第二次比较中返回 true。因此,它无法进行比较的反身属性,从而扰乱了地图。为了使 map 正常工作,您必须定义您的 operator> 以便==用于可能比较的所有可能的不相等的值对。{1, 0, 0}{0, 1, 0}a > bb > aa > b!(b > a)

编辑

确保您的运算符具有正确自反性的最简单/最好的方法是确保对于每个可能返回 true 的测试,您还有一个具有相同条件的测试并且交换的操作数返回 false。所以如果你有

if(v1.DATA[1] > v2.DATA[1]) return 1;

在您的功能中,您需要

if(v2.DATA[1] > v1.DATA[1]) return 0;

或某处的等价物。

于 2010-10-29T18:56:38.093 回答
2

这是复杂结构的字典比较器

struct D {
  struct A {
    bool operator <(const A &) const;
  } a;
  struct B {
    bool operator <(const B &) const;
  } b;
  struct C {
    bool operator <(const C &) const;
  } c;
  template <class T> ne(const T & a, const T & b) {
    if (a < b) return true;
    if (b < a) return true;
    return false;
  }
  bool operator < (const D & that) const {
    if (ne(a, that.a)) return a < that.a;
    if (ne(b, that.b)) return b < that.b;
    return c < that.c;
  }
};
于 2010-10-29T17:39:20.007 回答
0

如果您的映射仅包含指向您的结构的指针,则您不必执行所有复杂的运算符重载。

因此,您的 typedef 如下所示:

typedef map<somecomplexstruct*, int, greater<somecomplexstruct*> > somecomplexstructMap;

结构通常只有公共数据成员,不需要运算符重载。

这意味着尽管您必须小心何时以及如何释放指针的内存。每种方法都有优点和缺点,就像所有事情一样。

于 2010-10-30T01:37:18.370 回答