Ich brauche eine unordered_multimap für meine Notiz Objekte und die Schlüssel werden das measureNumber Mitglied meiner Objekte sein.
OK - ich bin mir nicht sicher, ob Sie nach einem multiset
, sind unordered_multiset
, multimap
oder unordered_multimap
. Ich weiß, dass Ihr Titel unordered_multimap
bezieht, aber der Link zur Verfügung gestellt, führt zu unordered_multiset
. Es gibt eine Vielzahl von Überlegungen, die berücksichtigt werden sollten, wenn ein Behälter der Wahl, aber zweite Mutmaßung, die das beste Ergebnis erzielt, ohne Profilierung wird ein riskantes Geschäft ist.
Ich verstehe nicht, warum ich den Operator == überschreiben muss, bevor ich es verwenden kann. Ich bin auch verwirrt darüber, warum ich einen Hash brauche und wie man ihn implementiert. In diesem Beispiel wird keines dieser beiden Dinge getan.
Sie müssen die operator==
und std::hash
, wie sie von unordered_multimap
und unordered_multiset
intern verwendet sind. In dem Beispiel, mit dem Sie verbunden sind, ist der Schlüssel vom Typ int
, daher sind operator==
und std::hash<int>
bereits definiert. Wenn Sie Note
als Schlüssel verwenden, müssen Sie diese selbst definieren.
Ich würde empfehlen, mit einem multiset
starten, wenn Sie die Elemente nicht häufig ändern müssen. Wenn Sie tun möchten in der Lage sein, Note
s ohne Löschen und Einfügen zu ändern, würde ich empfehlen, measureNumber
als Mitglied von Note
zu entfernen und eine multimap<int, Note>
verwenden.
Wenn Sie glauben, dass eine unordered_
Version Ihres Containers Ihren Anforderungen besser entspricht, haben Sie immer noch die set
vs map
Wahl. Wenn Sie unordered_multimap<int, Note>
(measureNumber
von Note
entfernt) auswählen, ist der Schlüssel wie in Ihrem verknüpften Beispiel int
. Sie müssen also nichts Besonderes definieren, damit dies funktioniert. Wenn Sie measureNumber
als ein Mitglied von Note
behalten und unordered_multiset<Note>
verwenden, dann ist Note
der Schlüssel und Sie müssen weitere Arbeit, z.
#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);
}
Damit können Sie std::unordered_multiset<Note>
erstellen und verwenden. Allerdings bin ich mir nicht sicher, dass wirklich ist, was Sie brauchen; Sie könnten sogar finden, dass eine sortierte std::vector<Note>
für Sie am besten ist. Weitere Forschung und Überlegungen, wie Sie Ihren Container zusammen mit Profiling verwenden, sollte die beste Antwort geben.
Und wie würde ich die multimap so konstruieren? 'multimap noteMap;' Und geht die Definition der 'operator <' Funktion in den Header oder in die Implementierungsdatei? –
networkprofile
@Sled OK, ich hoffe, das ist was du suchst. Müssen jetzt gehen, viel Glück! – Potatoswatter
Ich habe Getter und Setter für die measureNumber, das ist also nicht wirklich ein Problem. Was ich jetzt erkenne, ist, dass es schwierig ist, eine bestimmte Note zu entfernen, da sie von measureNumber gemappt werden, aber ich brauche dieses Modell für die Echtzeitsynthese, wo ich die Noten so schnell wie möglich nach Maß finden muss und das scheint wie a guter Weg so weit. (Ich musste die Dinge oft ändern) Vielen Dank für Ihre Hilfe! – networkprofile