私はstd :: unordered_mapを見ていて、文字列をキーとして使用したい場合は、ファンクタを含むクラスを作成する必要があることがわかりました。テンプレートパラメータにラムダ関数を使用することはできますか?
好奇心で、私はラムダがこれの代わりに使用できるかどうか疑問に思っていました。ここで
は、作業元です:
std::unordered_map<string const, int, [](string const& key) ->size_t {return key[0];}> m = {{ "a", 1 }};
次のエラーで失敗しました:ここ
struct hf
{
size_t operator()(string const& key) const
{
return key[0]; // some bogus simplistic hash. :)
}
}
std::unordered_map<string const, int, hf> m = {{ "a", 1 }};
は私の試みだ
エラーを考えるexec.cpp: In lambda function:
exec.cpp:44:77: error: ‘key’ cannot appear in a constant-expression
exec.cpp:44:82: error: an array reference cannot appear in a constant-expression
exec.cpp: At global scope:
exec.cpp:44:86: error: template argument 3 is invalid
exec.cpp:44:90: error: invalid type in declaration before ‘=’ token
exec.cpp:44:102: error: braces around scalar initializer for type ‘int’
、それはように思わlambaはファンクタとは十分に異なり、定数式ではありません。あれは正しいですか?
'std :: hash'は' std :: string'に特化していますので、ハッシュを改善/変更したくない場合は、自分で用意する必要はありません。また、あなたがやっていることを考えてみてください。 'std :: unordered_map'はテンプレート引数として*型*を期待しています。ラムダ式はまさにその式です。 – Xeo
私はg ++コンパイラで(v4.5.3と-std = gnu ++ 0x)を使用していたことがわかりました。文字列キーを使用するときにハッシュ関数を指定しなかった場合、エラーが発生します。 – Adrian
それは表現で、ええ、それは答えになると思います。 – Adrian