Ich begann ursprünglich mit einer std::multimap
, um viele Werte mit dem gleichen Schlüssel zu speichern, aber dann entdeckte ich, dass es die Reihenfolge der Einfügungen unter den Werten mit dem gleichen Schlüssel nicht beibehalten. This answer behauptet, es kann mit boost::multi_index::multi_index_container
getan werden, gibt aber kein Beispiel. Wenn man sich die Dokumente ansieht, gibt es keine Beispiele für diese Verwendung, und ich kann nicht verstehen, wie man dieses Ding benutzen soll. Ich erwarte schlechte Dokumentation von den weniger genutzten Boost-Bibliotheken, aber das bringt den Kuchen. Kann mir jemand auf ein Tutorial oder ein Beispiel hinweisen, das zeigt, dass es so verwendet wird, wie ich es möchte, oder vielleicht sogar selbst ein Beispiel geben?Verwenden von Boost multi_index_container zum Beibehalten der Einfügereihenfolge
Antwort
Sie können dies erreichen, indem Sie boost::multi_index
mit zwei Indizes verwenden: ordered_non_unique
(die Werte mit dem gleichen Schlüssel ermöglicht) und random_access
(die die Reihenfolge beibehalten).
struct some {
long key;
int data;
int more_data;
// etc.
};
typedef multi_index_container<
some,
indexed_by<
random_access<>, // keep insertion order
ordered_non_unique< member<some, long, &some::key> >
>
> some_mic_t;
Unterstützen diese Antwort, von der Boost-Dokumentation: ** Direktzugriffsindizes sind freie Reihenfolge Sequenzen mit konstanter Zeit Positionszugriff und Random-Access-Iteratoren. Elemente in einem Direktzugriffsindex werden standardmäßig nach ihrer Reihenfolge sortiert. ** –
Wie wärs mit einem
map<int, vector<string> >
oder
map<int, list<string> >
@Kirill: Gute Antwort. Ich vermute, Boost's random_access kann ziemlich langsam sein, da es alle Strings für alle Schlüssel zwingt, in einer einzigen zusammenhängenden Struktur zu bleiben. Der Fragesteller möchte lediglich, dass die Reihenfolge innerhalb der Menge der abgebildeten Werte jeder Taste erhalten bleibt.
'random_access' ist ein zusätzlicher Index. Sie verwenden 'ordered_non_unique' für die Suche, dann' random_access', um den resultierenden Bereich zu durchlaufen. Es ist nicht langsam. –
(I multi_index viel benutzt habe, aber nicht random_index, also bin ich nicht zu sicher über irgendetwas davon) @Kirill: Zwei Punkte: @rmeador will in der Lage sein „, um die Anzeigenauftrag unter den Werten zu bewahren mit derselben Taste ". Wie kann mit einem einzigen Schlüssel der gesamte Zufallsindex verwendet werden, um dies schnell zu erreichen? Ich vermute, dass die von mir vorgeschlagene Struktur der einzige Weg ist, dies zu tun. und Ich meinte, dass das Einfügen neuer Elemente langsamer als notwendig sein kann, da der gesamte Zufallsindex möglicherweise veraltet ist. –
@Kirill: Um zu klären, wie die sortierten_non_unique einen Bereich von (unsortierten) Werten entsprechend einem einzelnen Schlüssel identifiziert hat, wie verwenden Sie dann (schnell) den random_access, um diese Menge von Werten zu sortieren? Diese Menge von Werten kann gleichmäßig über einen großen random_access-Index verteilt sein. Das Iterieren über den random_access-Bereich hält die Schlüssel nicht in der richtigen Reihenfolge. –
- 1. Boost multi_index_container, erhalten Index von Tag Ergebnisse in Compiler Fehler
- 2. Boost MPI zum Senden von Dateien verwenden?
- 3. Was ist der Punkt von boost :: multi_index_container :: index <Tag> :: Typ?
- 4. Verwenden von Boost MPL zum Berechnen von Längen von Vektoren
- 5. STL Multiset Einstellung Einfügereihenfolge C++
- 6. Verwenden von Modular Boost von GitHub
- 7. Boost mit Emscript verwenden
- 8. equal_range auf einer Taste, unten/oben auf einem anderen gebunden im Boost-multi_index_container composite_key
- 9. Verwenden von boost :: format in einem boost :: lambda
- 10. Verwenden von QChecksum anstelle von Boost crc16
- 11. Verwenden von Boost Graph Bibliothek: property_map in boost :: mutable_queue
- 12. Boost Shared Memory verwenden
- 13. MySQL, ORDER BY-Einfügereihenfolge, keine Sortierspalten
- 14. Verwenden von Boost Python & std :: shared_ptr
- 15. Boost-Funktion als Klassendatenelement zum Aufrufen verschiedener Elementfunktionen verwenden
- 16. Verwenden von Boost-Test mit Visual Studio
- 17. Ansätze zum Beibehalten von Objektattributen beim Extrahieren/Ersetzen von Operationen
- 18. Verwenden von named_scope zum Abrufen der Zeilenanzahl
- 19. Verwenden von GhostScript zum Abrufen der Seitengröße
- 20. Verwenden von Maven zum Verwalten der Benutzerdokumentation
- 21. Verwenden von Session zum Speichern der Authentifizierung?
- 22. Verwenden von Textmarker zum Hervorheben der Phrasenabfrage
- 23. Verwenden von Ajax zum Aktualisieren der Liste.
- 24. Verwenden von @media zum Ändern der Positionierung
- 25. Verwenden von UIStackView zum Zentrieren der Einzelansicht
- 26. Verwenden von C++ Boost Speicherabbilddateien zum Erstellen von Disk-Back-Datenstrukturen
- 27. Verwenden von Boost :: lambda_ zum Komprimieren von Leerzeichen in einer Zeichenfolge
- 28. Verwenden Sie Boost C++ - Bibliotheken?
- 29. boost :: serialisierung von boost :: unordered_map
- 30. Fokus von JInternalFrame beibehalten
Benötigen Sie eine Multi-Map? – doublep
Ja, das tue ich. Ich habe mehrere Werte mit demselben Schlüssel. – rmeador