我需要为我的 Note 对象使用 unordered_multimap,键将是我的对象的 measureNumber 成员。
好的 - 我不确定你是在追求multiset
, unordered_multiset
, multimap
, 还是unordered_multimap
. 我知道您的标题指的是unordered_multimap
,但您提供的链接指向unordered_multiset
. 在选择容器时应该考虑很多因素,但是在没有分析的情况下事后猜测哪个性能最好是有风险的。
我不明白为什么我必须先覆盖 operator== 才能使用它。我也对为什么需要哈希以及如何实现它感到困惑。在这个例子中,这两件事都没有完成。
您需要operator==
andstd::hash
因为它们在内部被unordered_multimap
and使用unordered_multiset
。在您链接到的示例中,键的类型为int
,因此operator==
和std::hash<int>
已经定义。如果选择Note
用作键,则必须自己定义这些。
multiset
如果您不需要经常更改元素,我建议您从 a 开始。如果您确实希望能够在Note
不删除和插入的情况下更改 s,我建议您将measureNumber
其作为成员删除Note
并使用multimap<int, Note>
.
如果您觉得unordered_
您的容器版本更适合您的需求,您仍然可以选择set
vs。map
如果您选择unordered_multimap<int, Note>
(已从 中删除measureNumber
)Note
,那么与您的链接示例一样,键是int
。因此,您不必为此定义任何特殊的东西。如果您选择保留measureNumber
并Note
使用unordered_multiset<Note>
,那么Note
是关键,因此您需要做进一步的工作,例如
#include <functional>
#include <unordered_set>
class Note; // Forward declaration to allow specialisation of std::hash<>
namespace std {
template<>
class hash<Note> {
public:
size_t operator()(const Note &) const; // declaration of operator() to
// allow befriending by Note
};
}
class Note {
private:
int measureNumber;
public:
// functions befriended to allow access to measureNumber
friend bool operator== (const Note &, const Note &);
friend std::size_t std::hash<Note>::operator()(const Note &) const;
};
inline bool operator== (const Note ¬eOne, const Note ¬eTwo) {
return noteOne.measureNumber == noteTwo.measureNumber;
}
std::size_t std::hash<Note>::operator()(const Note ¬e) const {
return std::hash<int>()(note.measureNumber);
}
这使您可以创建和使用std::unordered_multiset<Note>
. 但是,我不确定这是否真的是您需要的;您甚至可以发现 sortedstd::vector<Note>
最适合您。关于如何使用容器以及分析的进一步研究和思考应该会给出最好的答案。