Để hỗ trợ người dùng xác định loại quan trọng trong std::unordered_set<Key>
và std::unordered_map<Key, Value>
người ta phải cung cấp operator==(Key, Key)
và một functor băm:Làm cách nào để chuyên std :: hash <Key> :: toán tử() cho loại do người dùng xác định trong vùng chứa không có thứ tự?
struct X { int id; /* ... */ };
bool operator==(X a, X b) { return a.id == b.id; }
struct MyHash {
size_t operator()(const X& x) const { return std::hash<int>()(x.id); }
};
std::unordered_set<X, MyHash> s;
Nó sẽ là thuận tiện hơn để viết chỉ std::unordered_set<X>
với một hash mặc định cho loại X
, như đối với các loại đi kèm với trình biên dịch và thư viện. Sau khi tham khảo ý kiến
- C++ chuẩn Draft N3242 §20.8.12 [unord.hash] và §17.6.3.4 [hash.requirements],
- Boost.Unordered
- g ++
include\c++\4.7.0\bits\functional_hash.h
- VC10
include\xfunctional
- khác nhau related question s trong Stack Overflow
it se ems thể chuyên std::hash<X>::operator()
:
namespace std { // argh!
template <>
inline size_t
hash<X>::operator()(const X& x) const { return hash<int>()(x.id); } // works for MS VC10, but not for g++
// or
// hash<X>::operator()(X x) const { return hash<int>()(x.id); } // works for g++ 4.7, but not for VC10
}
Với trình biên dịch hỗ trợ cho C++ 11 vẫn chưa thực nghiệm --- Tôi không cố gắng Clang ---, đây là những câu hỏi của tôi:
Có hợp pháp để thêm chuyên môn như vậy vào không gian tên
std
? Tôi có cảm xúc lẫn lộn về điều đó.Phiên bản
std::hash<X>::operator()
nào, nếu có, tuân thủ tiêu chuẩn C++ 11?Có cách nào để di chuyển không?
Với gcc 4.7.2, tôi đã phải cung cấp một 'toán tử == toàn cầu (Key const, const Key) ' –