2012-09-26 2 views
6

Problem ist einfach: Wir haben eine Klasse, die Mitglieder a, b, c, d ... Wir wollen in der Lage sein, schnell zu suchen (Schlüssel Wert eines Mitglieds) und aktualisieren Klassenliste mit neuen Wert durch Bereitstellung aktueller Wert für a oder b oder c ... Ich dachte über eine Reihe von
std::map<decltype(MyClass.a/*b,c,d*/),shared_ptr<MyClass>>.Wird eine Map verwendet, deren Wert std :: shared_ptr ist, eine gute Design-Option für multiindizierte Klassenlisten?

1) Ist das eine gute Idee?

2) Ist Boost Multi Index dieser handgefertigten Lösung in jeder Hinsicht überlegen?

PS SQL kommt aus Gründen der Einfachheit/Perf. Nicht in Frage.

+0

"* Ist Boost-Multi-Index dieser handgefertigten Lösung in jeder Hinsicht überlegen? *" MultiIndex unterstützt noch keine Bewegungssemantik. : - [ – ildjarn

Antwort

7
  1. Boost-Multiindex kann einen deutlichen Nachteil haben, dass sie versuchen werden, alle Indizes zu halten bis nach jeder Mutation der Sammlung auf dem Laufenden. Dies kann eine große Leistungseinbuße bedeuten, wenn Sie eine Datenladephase mit vielen separaten Schreibvorgängen haben.

  2. Die Nutzungsmuster von Boost Multi Index stimmen möglicherweise nicht mit dem Programmierstil (und Geschmack ...) des Projekts (Mitglieder) überein. Dies sollte ein kleiner Nachteil, aber ich dachte, dass ich es

  3. erwähnen würde

    Wie ildjarn erwähnt, Boost-MI nicht bewegt Semantik als die noch

Ansonsten unterstützen, würde ich Multiindex Erhöhung betrachten in den meisten Fällen überlegen, da es unwahrscheinlich ist, dass Sie die Testmenge erreichen.

+0

in Bezug auf die Menge der Prüfung .... es ist ein schwieriger Vergleich seit handgefertigte Lösung hat viel weniger Tests, sondern auch viel weniger LOC – NoSenseEtAl

+0

Gut, dass es nur meine Meinung ist, dann :) - Zumindest die Boost LOC wurden von mehr Augenpaaren begutachtet, als sich die meisten internen Teams leisten können. – sehe

1

Sie möchten in Betracht ziehen, alle Ihre Maps in einer einzigen Klasse zu speichern und willkürlich einen der Container als den zu definieren, der die "echten" Objekte speichert, und dann einfach einen std::map mit einem zugeordneten Typ roher Pointer verwenden zu Elementen der ersten std::map.

Dies wäre jedoch ein wenig schwieriger, wenn Sie jemals Kopien dieser Karten erstellen müssen.

+0

Oder einfach Iteratoren in die erste Map statt roher Zeiger auf ihre Elemente. –

+0

bin ich falsch zu denken, dass sizeof shared_ptr im Vergleich zu sizeof Iterator ist nicht so groß ein Problem, esp seit Iirc Karte hat 3 Zeiger pro Element – NoSenseEtAl

+0

@ChristianRau Iteratoren in die erste Karte, ich denke, wäre der falsche Weg für die meisten Anwendungen gehen. Sie müssten etwas wie "map.find (key) -> second-> second" anstatt nur "map.find (key) -> second" machen. Sie fügen eine zusätzliche Schicht von Indirection ohne Nutzen hinzu. –

Verwandte Themen