2012-03-22 7 views
2

私は、単一の整数の整数のトリプレットをマップするC++ stdのunordered_mapを使用して、私は通常、(彼らはとてもクールだった知らなかった)ハッシュテーブルを使用していないが、私はこのような場合には適切なアプローチを知りません、デフォルトのハッシュ関数を使用して、私が直接トリプレットをマップする必要があります(何かのint、int型> < <のような、整数> - > int型)"int triplets"をintにマップしますか?

std::unordered_map <std::make_pair <make_pair <int,int>,int>,int> hash; 

または多分単一の値と使用にトリプレットをマッピングする機能を使用その値はデフォルトの関数ですか?

int mapping(int a, int b, int c){ 
} 

std::unordered_map <int,int> hash; 

は仕事に近づくの両方が、私はウィッヒ1が最も効率的である知っているように思います。ありがとうございます

+1

[std :: tuple](http://en.cppreference.com/w/cpp/utility/tuple)にアクセスできますか? –

+0

(「ペア」は「タプル」だけの特別な種類です:2つの要素を持つこと) –

+0

はい私はHACEのはstdする::タプルをアクセスもない、私はちょうどないんだけど、C++のライブラリを使用したことを、私はそれをチェックします – Alb3rt

答えて

3

まずオフを構成していることを確認してください...あなた自身のハッシュ関数を使用します。

次に、あなたが各要素をハッシュすることができますことを考えるとタプルをハッシュする方法が必要です。 Boostにはhash_combineという機能がありますが、それは私には不明な理由から標準には含まれていませんでした。とにかく、ここに行く:

#include <tuple> 
#include <utility> 

template <class T> 
inline void hash_combine(std::size_t & seed, const T & v) 
{ 
    std::hash<T> hasher; 
    seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); 
} 

template <class Tuple, std::size_t Index = std::tuple_size<Tuple>::value - 1> 
struct tuple_hash_impl 
{ 
    static inline void apply(std::size_t & seed, Tuple const & tuple) 
    { 
     tuple_hash_impl<Tuple, Index - 1>::apply(seed, tuple); 
     hash_combine(seed, std::get<Index>(tuple)); 
    } 
}; 

template <class Tuple> 
struct tuple_hash_impl<Tuple, 0> 
{ 
    static inline void apply(std::size_t & seed, Tuple const & tuple) 
    { 
     hash_combine(seed, std::get<0>(tuple)); 
    } 
}; 

namespace std 
{ 
    template<typename S, typename T> struct hash<pair<S, T>> 
    { 
     inline size_t operator()(const pair<S, T> & v) const 
     { 
      size_t seed = 0; 
      ::hash_combine(seed, v.first); 
      ::hash_combine(seed, v.second); 
      return seed; 
     } 
    }; 

    template<typename ...Args> struct hash<tuple<Args...>> 
    { 
     inline size_t operator()(const tuple<Args...> & v) const 
     { 
      size_t seed = 0; 
      tuple_hash_impl<tuple<Args...>>::apply(seed, v); 
      return seed; 
     } 
    }; 
} 
0

ペアのペアを持つあなたのソリューションはかなり効率的でなければなりません。ハッシングが関係する限り、3つの整数をより簡単なものにマップすることは難しいでしょう。

1

は「最も効率的には、」あなたのコンパイラに応じて、何かのように思えるが、私はmake_pairソリューションは、混乱のように見えると言うでしょう。より良いだけであなたがキータイプとしてstd::tuple<int, int, int>を使用することになり、まともな1 :)

関連する問題