map
存儲其元素通過鍵進行排序;所以你需要定義這個順序。
如果該鍵是一個類類型,你可以過載operator<
,這樣的std::less
作品的默認排序:
bool operator<(my_thing const & a, my_thing const & b) {
// return true if "a" is ordered before "b"
}
std::map<my_thing, something_else> my_map;
,或者你可以提供自己的比較仿函數
struct compare_my_thing {
bool operator()(my_thing const & a, my_thing const & b) {
// return true if 'a' is ordered before 'b'
}
};
std::map<my_thing, something_else, compare_my_thing> my_map;
unordered_map
是一個哈希表;所以你需要定義一個散列函數和一個平均值比較的方法(因爲散列通常不是唯一的)。同樣,你可以提供過載,使缺省值(std::hash
和std::equal_to
)工作:
namespace std {
template <>
struct hash<my_thing> {
std::size_t operator()(my_thing const & t) const {
// return hash of 't'
}
};
}
bool operator==(my_thing const & a, my_thing const & b) {
// return true if 'a' and 'b' are equal
}
std::unordered_map<my_thing, something_else> my_map;
,或者你可以提供自己的仿函數
struct hash_my_thing {
std::size_t operator()(my_thing const & t) const {
// return hash of 't'
}
};
struct compare_my_thing {
bool operator()(my_thing const & a, my_thing const & b) {
// return true if 'a' and 'b' are equal
}
};
std::unordered_map<my_thing, something_else, hash_my_thing, compare_my_thing> my_map;
so why is the template so intrusive? i mean it should act as a container, not minding what is the object about nor what is inside of it
不同的容器具有它們所包含的不同要求類型。例如,yhey都要求它們是可破壞的,因爲容器負責管理它們的生命週期。有些要求它們是可移動的;例如,vector
在分配更大的數組時需要移動元素以使它們保留在其中。關聯容器對其關鍵類型有額外的要求,以允許它們用作關鍵點。
另請參閱http://stackoverflow.com/questions/17016175/c-unordered-map-using-a-custom-class-type-as-the-key – juanchopanza