2010-07-13 6 views
5

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

+0

Benötigen Sie eine Multi-Map? – doublep

+0

Ja, das tue ich. Ich habe mehrere Werte mit demselben Schlüssel. – rmeador

Antwort

6

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; 
+1

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. ** –

0

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.

+0

'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. –

+0

(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. –

+1

@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. –

Verwandte Themen