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.
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 –
Kann mehrstufige Verweise auf Objekt sein? Die Kosten werden sich fast verdoppeln. –
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. –