2017-12-27 4 views
1

私は自分自身の構造のために新しいハッシュ関数を書こうとしています。問題が来るカスタマイズ構造で定義された順序付けられていないセットのカスタマイズハッシュ関数を書く方法は?

struct peopleHash{ 
    size_t operator()(const people& p) const{ 
     return p.id; 
    } 
} 

そして、ここで:

struct people{ 
    int id; 
    unordered_set<people>friends; 
    people(int x) : id(x) {} 
}; 

そして、私は友人のためにハッシュ関数を必要とする、のように:ここに私のコードは、私が最初に人々を初期化する場合は、peopleHash機能は、「未定義見つけるだろうタイプの人々 "。人ハッシュを最初に初期化すると同じことが起こります。私は次のように、人々の構造体の内部でpeopleHashを定義しようとしました:

struct people{ 
    int id; 
    struct peopleHash{ 
     size_t operator()(const people& p) const{ 
      return p.id; 
     } 
    }; 
    unordered_set<people, peopleHash>friends; 
    people(int x) : id(x) {} 
}; 

しかし、コンパイラは言った:

error: invalid operands to binary expression ('const people' and 'const people') 
     {return __x == __y;} 

私はこれに対処する方法は考え...任意の助けを持っていませんか?

+1

'people :: operator =='を実装してください。 2つのインスタンスが同じハッシュ値を持つ場合、それらのインスタンスは等しいかどうか比較されます。 – Praetorian

+1

ハッシュの問題だけではありません。順序付けられていないコンテナのクラスも '=='演算子を実装する必要があり、コンテナのクラスは完全な型でなければなりません。これは 'people'の定義が完了するまで起こりません。これは単なる循環依存性の問題以上のものであり、それ自体が順方向宣言で明白に扱われています。 –

+0

@Praetorian返信いただきありがとうございます!私は演算子==を追加しましたが、エラーが表示されます:オーバーロードされた '演算子=='は2項演算子(3つのパラメータがあります)でなければなりません...わかりません... bool演算子==(const people&x、const人&y){ return x.id == y.id; } –

答えて

1

これはできません。 peopleは、未定義の動作であるstd::unordered_setをインスタンス化すると、不完全な型になります。 http://eel.is/c++draft/library#res.on.functionsを参照してください。

+0

うーむ..しかし、私はその人のIDと彼の友人を表すタイプが必要です。彼と彼の友人に共通の友人がいるかどうかを確認する必要があります。私がsetの代わりにvectorを使うと、ベクトル全体をたどって交差点を見つけなければならないたびに、時間がかかります...これについてもっと良い解決策はありますか? –

関連する問題