ในการรองรับประเภทคีย์ที่ผู้ใช้กำหนดstd::unordered_set<Key>
และstd::unordered_map<Key, Value>
ต้องระบุoperator==(Key, Key)
และแฮช functor:
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;
จะสะดวกกว่าในการเขียนstd::unordered_set<X>
โดยใช้แฮชเริ่มต้นสำหรับประเภทX
เช่นประเภทที่มาพร้อมกับคอมไพเลอร์และไลบรารี หลังจากปรึกษา
- C ++ Standard Draft N3242 §20.8.12 [unord.hash] และ§17.6.3.4 [hash.requirements],
- เพิ่มไม่เรียงลำดับ
- g ++
include\c++\4.7.0\bits\functional_hash.h
- VC10
include\xfunctional
- คำถามที่เกี่ยวข้องต่างๆใน Stack Overflow
ดูเหมือนจะเชี่ยวชาญ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
}
เนื่องจากการสนับสนุนคอมไพเลอร์สำหรับ C ++ 11 ยังเป็นการทดลอง - ฉันไม่ได้ลองเสียงดัง --- นี่คือคำถามของฉัน:
การเพิ่มความเชี่ยวชาญดังกล่าวให้กับเนมสเปซถูกกฎหมาย
std
หรือไม่? ฉันมีความรู้สึกหลากหลายเกี่ยวกับเรื่องนั้นซึ่งใน
std::hash<X>::operator()
รุ่นถ้ามีสอดคล้องกับ C ++ 11 มาตรฐาน?มีวิธีทำแบบพกพาไหม
operator==(const Key, const Key)