Tôi đã nhìn vào std :: unordered_map và thấy rằng nếu tôi muốn sử dụng một chuỗi như là chìa khóa, tôi sẽ phải tạo một lớp có chứa một functor.Có thể sử dụng hàm lambda cho tham số mẫu không?
Ngoài sự tò mò, tôi đã tự hỏi liệu một lambda có thể được sử dụng thay cho điều này không.
Dưới đây là bản gốc làm việc:
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 }};
Đây là nỗ lực của tôi:
std::unordered_map<string const, int, [](string const& key) ->size_t {return key[0];}> m = {{ "a", 1 }};
Đó thất bại với các lỗi sau đây:
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’
Với lỗi, nó sẽ có vẻ rằng Lamba là đủ khác nhau từ một functor rằng nó làm cho nó không phải là một biểu hiện liên tục. Đúng không?
'std :: hash' là chuyên biệt cho' std :: string', không cần phải cung cấp một cái gì đó cho mình nếu bạn không muốn cải thiện/thay đổi băm. Ngoài ra, hãy suy nghĩ về những gì bạn đang làm: 'std :: unordered_map' mong đợi một * type * làm đối số mẫu và biểu thức lambda chính xác là - biểu thức, nghĩa là giá trị, * not * a type. – Xeo
Tôi thấy rằng trong trình biên dịch g ++ tôi đã sử dụng (v4.5.3 với -std = gnu ++ 0x), nó sẽ cho tôi một loạt các lỗi nếu tôi không chỉ định hàm băm khi sử dụng một khóa chuỗi. – Adrian
Đối với nó là một biểu hiện, vâng, tôi đoán đó sẽ là câu trả lời. – Adrian