10

カスタムハッシュ関数と等価比較関数を持つunordered_mapのタイプを定義しようとしています。これらの関数の関数プロトタイプは次のとおりです。

//set<Vertex3DXT*> is the type of the key; Cell3DXT* is the type of the value
size_t VertexSetHashFunction(set<Vertex3DXT*> vertexSet); //hash function
bool SetEqual(set<Vertex3DXT*> a, set<Vertex3DXT*> b); //equality

これらの関数プロトタイプを宣言してから、次のように型を宣言しようとします。

typedef std::tr1::unordered_map<set<Vertex3DXT*>, Cell3DXT*, VertexSetHashFunction, SetEqual> CellDatabaseMapType;

ただし、VertexSetHashFunctionとSetEqualは有効なテンプレートタイプの引数ではないということです。テンプレート引数がどのタイプであるかを正確に示していないため、ドキュメントは混乱しています-ここで行ったように関数を与えることになっているだけですか、それとも関数をカプセル化する他の種類のオブジェクトがあります(ドキュメントは「ハッシュ関数オブジェクトタイプ」について話しますか?

4

2 に答える 2

9

残念ながら、これらの関数はクラス内で演算子()として宣言する必要があります。このような:

class VertexSetHashFunction {
  public:
    ::std::size_t operator ()(const ::std::set<Vertex3DXT*> &vertexSet) const;
};
class SetEqual {
  public:
    bool operator ()(const ::std::set<Vertex3DXT*> &a, const ::std::set<Vertex3DXT*> &b) const;
};

const参照になるように引数を変更する必要はありませんが、強くお勧めします。:: std :: setのコピーを作成するのは比較的費用がかかるため、絶対に必要な場合を除いて、作成しないでください。

末尾のconstは、オペレーターが実際にクラスの状態をまったく変更しないためです。ほとんどの場合、クラスの状態が変更されないためです。はっきりと言うのはいいことです。

または、:: std::hashテンプレートの独自の特殊化を定義することもできます。特定のセットをハッシュする標準的な方法が1つある場合は、実際にこれをお勧めします。これは、ハッシュ関数を提供しない場合、unordered_mapまたはハッシュ関数を必要unordered_setとするその他のものにこのテンプレートがデフォルトで使用されるためです。

于 2010-01-20T07:06:47.810 に答える
5

ファンクターが必要です。

struct VertexSetHashFunction {
    size_t operator() (const set<Vertex3DXT*>& vertexSet) const { return /*whatever*/; }
};

struct SetEqual {
    bool operator() (const set<Vertex3DXT*>& a, const set<Vertex3DXT*>& b) const { return /*whatever*/; }
};
于 2010-01-20T07:21:49.490 に答える