Để hỗ trợ các loại khóa do người dùng xác định 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 bộ chức năng băm:
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;
Sẽ thuận tiện hơn nếu chỉ viết std::unordered_set<X>
với một hàm băm mặc định cho kiểu X
, như cho các kiểu đi kèm với trình biên dịch và thư viện. Sau khi tư vấn
- Bản nháp tiêu chuẩn C ++ N3242 §20.8.12 [unard.hash] và §17.6.3.4 [hash.requirements],
- Boost.Unordered
- g ++
include\c++\4.7.0\bits\functional_hash.h
- VC10
include\xfunctional
- các câu hỏi liên quan khác nhau trong Stack Overflow
có vẻ như có thể chuyên môn hóa 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
}
Hỗ trợ trình biên dịch cho C ++ 11 vẫn chưa được thử nghiệm --- Tôi đã không thử Clang ---, đây là những câu hỏi của tôi:
Việc thêm một chuyên ngành như vậy vào không gian tên có hợp pháp không
std
? Tôi có cảm xúc lẫn lộn về điều đó.std::hash<X>::operator()
Phiên bản nào trong số các phiên bản, nếu có, tuân thủ tiêu chuẩn C ++ 11?Có một cách di động để làm điều đó?
std::hash
(không giống như những thứ khác trong std
không gian tên) ; Mang nó theo một hạt muối.
operator==(const Key, const Key)