Sparse-array in C++
Brauche ich eine Vektor-wie container, mit ganzzahliger Indizierung, aber wo einige Indizes weggelassen. Also, was ist die gängige Methode zur Darstellung von solchen sparse-array in C++?
Ich habe eine intuition, die std::map ist hauptsächlich für solche Zwecke eingesetzt. Aber es ist Recht langsam für einen container, in dem neue Elemente sind meist nicht Hinzugefügt. Was können Sie vorschlagen?
UPD: Nicht sehr "spärlich". Vielleicht über 5%. Elemente, die meist während der Initialisierung in Schritt (und nicht sehr oft nach). Aber der Zugang ist Häufig (natürlich möchte ich nicht zu diesem Thema, wenn es nicht entscheidend war).
- Versuchen Sie eine unsortierte anzeigen von boost und C++11.
- Wie spärlich ist "spärlich"? Prozentsatz? Wenn die Speicherung von zusätzlichen Werten zwischen ist zu erwarten, Häufig, einige Techniken möglicherweise nicht geeignet. Sie benötigen Häufig Zugriff/iteration in der index-Reihenfolge?
- Erklären Sie, wie es langsam ist.
- boost-flache Karte ist, eine schnellere version der map, außer Einfügungen sind super langsam (O (n)), so dass Ihre Nutzung Muster muss füllen anzeigen verwenden Sie anzeigen, nicht: füllen Sie die Karte verwenden, hinzufügen , verwenden, hinzufügen , entfernen, verwenden Sie...
- Das scheint eine XY-Problem. Das problem ist anscheinend performance-Anforderungen, und Sie sind angenommen, dass der Weg zur Erreichung dieser Anforderungen ist die Verwendung eines sparse-Arrays.
- Wie viele arrays, was die (Durchschnittliche) Länge, und was ist der element-Typ? Könnte sein, dass ein reguläres array ist nicht allzu teuer, und ich würde nicht behaupten, dass eine Karte ist zu langsam ohne benchmarking typische Szenarien.
- Ich habe Sie für lineare algebra, dann gibt es eine Reihe von C++ - Bibliotheken, Unterstützung von sparse-Vektoren und-Matrizen. Aus der Spitze von meinem Kopf, es ist Eigen und zu Steigern.uBlas.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In diesem Fall boost::container::flat_map kann eine gute option für Sie. Es ist im Grunde nur eine sortierte Vektor. Vorteile (geklaut von der website):
Einen potenziellen Nachteil:
Selbst wenn der Schlimmste Fall passiert beim einfügen oder löschen (verschieben von Elementen des zugrunde liegenden Vektor), ist es noch nicht so schlimm, Dank (1) die gute Nutzung des cache, (2) Verlagerung der zugrunde liegenden Elemente werden vektorisiert (Vektor-Anweisungen). Sie würde versuchen müssen, es in Ihrer Anwendung zu sehen, wenn Sie einfügen /löschen ist ein problem, da Ihre Nutzung Muster.
Wenn
flat_map
nicht für Sie geeignet ist, würde ich versuchenstd::unordered_map
.Ja, eine Karte ist in der Regel der richtige Ansatz.
Ich würde vorschlagen, eine C++11
unordered_map
(basierend auf hash-Tabellen) zu erhalten Blitz-schnell-Suche: es ist so ziemlich das beste was Sie tun können, ohne einen zusammenhängenden increment Schlüssel.unordered_map
erfüllen die vermeintliche Notwendigkeit für eine spärlich - container. Es gibt keine Garantie, dass eine beliebige nicht zugewiesene index zugeteilt hat, dieunordered_map
bis es indiziert wurde.unordered_map
vonsize_t
auf die gewünschte zugeordnete Typ. Was ist das problem?unordered_map
erfüllt nicht die Anforderung soll ein sparse-array. Aber wie gesagt, die falsche Frage war wahrscheinlich gefragt, die in den ersten Platz.Vielleicht so etwas wie
wäre genug für Sie.