ノード ポインターの一部をハッシュすることで、特定のリンク リスト操作を高速化しようとしています。これは私が使用しているコードです:
unordered_set< typename list< int >::iterator > myhashset;
Visual Studio 2012 で、"エラー C2338: C++ 標準では、この型のハッシュが提供されていません" というメッセージが表示されます。これは、コンパイラが反復子をハッシュする方法を認識していないためです。したがって、次のようにリスト イテレータ用に独自のハッシュ関数を実装する必要があります。
struct X{int i,j,k;};
struct hash_X{
size_t operator()(const X &x) const{
return hash<int>()(x.i) ^ hash<int>()(x.j) ^ hash<int>()(x.k);
}
};
イテレータのどのメンバーが一意性を保証するか (したがって、ハッシュしたいメンバー) を理解するのに苦労しています。もう 1 つの懸念は、それらのメンバーが非公開である可能性があることです。
頭に浮かぶ解決策の 1 つは、list::iterator を再実装することですが、これはハックのようで、維持するコードが増えます。