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が返されます。比較すると、2番目の比較からtrueが返されます。そのため、比較のための反射特性に失敗し、マップをスクランブリングします。マップが正しく機能するためには、比較される可能性のあるすべての可能な等しくない値のペアに対して==となるように演算子>を定義する必要があります。{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 に答える