8

このようなサイトがあります:

http://www.cplusplus.com/reference/unordered_map/unordered_map/

つまり、クラステンプレートのHashandPred引数に対して、クラスの代わりに関数ポインタを提供できます。std::unordered_mapただし、例はなく、可能であれば、この機能を機能させることはできませんでした。動作しない例:

bool unordered_eq(const char* const s1, const char* const s2)
{
  return !std::strcmp(s1, s2);
}

std::size_t unordered_hash(char const* s)
{
  return std::hash<std::string>()(s);
}

std::unordered_map<char const*, std::string,
  unordered_hash, unordered_eq> hashmap;
4

1 に答える 1

10

つまり、クラスの代わりに関数ポインタを提供できます

いいえ、それは誤解です。関数オブジェクトの代わりに関数ポインターをコンストラクターに提供できます。テンプレートパラメータはまだ型です-この場合は関数ポインタの型です。だから、あなたは書く必要があります

typedef unordered_map<
            char const*, string,
            size_t(*)(char const*), // type for hashing
            bool(*)(char const*, char const*) // type for equality
        > yourmaptype;

yourmaptype hm (
        4, // minimum number of buckets
        &unordered_hash, // function address for hashing
        &unordered_eq, // function address for equality
    );

標準ライブラリは最初のパラメータのデフォルト値を定義していますが、このデフォルト値は標準化されていません。nのベンダー固有のデフォルト値を維持し、同時にファンクターの値を設定する方法はないようです。ここでの4の使用はかなり恣意的です。

代わりに、デフォルトで構成可能な関数オブジェクトの使用を検討する必要があります。これにより、最小バケットサイズを指定せずに回避できるだけでなく、ファンクターをコンパイラーにインライン化するのがはるかに簡単になるため、潜在的に高速になります。

于 2013-03-11T09:12:48.770 に答える