2016-03-23 9 views
1

In einem meiner Projekte stieß ich auf eine Situation, wo ich In-Memory-Indizes von Objekten erstellen möchte. Der Primärindex könnte einen anderen Schlüssel verwenden und Sekundärindizes würden andere Elemente als Schlüssel verwenden. Wenn ich std::map für Primärindex alsWas ist die beste Möglichkeit, Objekte über Container hinweg zu teilen?

std::map<string, Object> 

dann bin mit der ist der beste Weg Verweis/Zeiger für den Sekundärindex mit einem anderen Behälter (wieder std :: map zum Beispiel all Objekte sind einzigartig unter Berücksichtigung) zu speichern, ohne zusätzliche Kopien des Objekts?

  • Mit rohen Zeigern oder Verweisen, die das Risiko von baumelnden Zeigern oder Referenzen darstellen (Ich weiß, dass im Idealfall, wenn Objekt aus primärem Index gelöscht wird, Sorgfalt auch aus getroffen werden soll Sekundärindex zu entfernen, aber würde die Zeiger/Referenzen in Sekundärindizes ungültig, wenn der Behälter für die primäre Index selbst intern einstellen?)

    std::map<string, const Object*>

  • oder sekundär von shared_ptr des in Primärindex und weak_ptr Index std::map<string, std::shared_ptr<Object>> // primary index std::map<string, std::weak_ptr<Object>> // secondary index
  • mit Kombination

Ich weiß, dass es für beide Ansätze Vor- und Nachteile gibt. Vor allem möchte ich nicht die Flexibilität verlieren, die Objekte direkt in den primären Container einzufügen, aber ich möchte auch nicht, dass der sekundäre Index die Objekte erneut kopiert. Die Schwierigkeit beim Verwenden von intelligenten Zeigern nur für den sekundären Index besteht darin, dass sie das Objekt nicht besitzen würden.

Vielen Dank im Voraus für Hilfe.

+1

Wie wäre es mit dem Primärschlüssel das Objekt zu referenzieren? 'std :: map // Sekundärindex, Wert ist Primärschlüssel'. Nachteil davon ist, dass Sie eine andere Kartensuche benötigen, um das Objekt zu erhalten. : P –

+0

Kann mehrstufige Verweise auf Objekt sein? Die Kosten werden sich fast verdoppeln. –

+0

Ich schlage vor, intelligente Zeiger auf die Objekte zu verwenden. Platziere Zeiger in einem 'std :: vector'. Als nächstes erstellen Sie Indizes, z. 'std :: map', mit einem Schlüssel und einem intelligenten Zeiger auf das Objekt. –

Antwort

1

Platzieren Sie Ihre Objekte in einem Container. Abhängig von der Häufigkeit des Hinzufügens/Löschens von Objekten möchten Sie möglicherweise einen Container in Betracht ziehen, der Referenzen auf seine Elemente nicht ungültig macht, z. B. std::list oder std::deque.

Dann referenzieren Sie für Ihre Karten einfach die Objekte (oder eines ihrer Mitglieder) mit Referenzen, d. H. Mit std::reference_wrapper.

Verkapseln Sie sowohl den Back-End-Speicher als auch die Indizes, damit Sie beim Hinzufügen oder Entfernen von Objekten ungültige Referenzen aus den Indizes entfernen und neue Referenzen hinzufügen.

Auf diese Weise müssen Sie nur Ihre Objekte einmal speichern und mit Smartpointern umgehen. Dies funktioniert natürlich nur, wenn Sie die Objekte besitzen und deren Lebensdauern kontrollieren, und wenn Sie die Indizes gekapselt halten können (um sie auf dem neuesten Stand zu halten).

Verwandte Themen