Verwenden eines benutzerdefinierten Zuordners in einem std :: scoped_allocator_adaptor mit std :: unordered_map

9

Ich versuche, einen einfachen Speicherpoolzuordner mit std::unordered_map zu verwenden. Ich habe den gleichen Allokator scheinbar erfolgreich mit std::string und std::vector verwendet. Ich möchte, dass die Elemente, die in der unordered_map (und dem Vektor) enthalten sind, auch diesen Zuordner verwenden, also habe ich meinen Zuordner in std::scoped_allocator_adaptor eingepackt.

Vereinfachter Definitionssatz:

%Vor%

Initialisiert als solches:

%Vor%

lake_alloc wird unten mit dem Rest des Iteratorcodes angezeigt. Der Fehler, den ich in Clang 3.3 bekomme, ist, dass es nicht allocator_type (in diesem Fall das mm_alloc des Paares von String zu Vektor) zu seinem eigenen __pointer_allocator kann. Dies ist ein interner Typ, der für die Hash-Map-Implementierung verwendet wird. Teilfehlerausgabe unten:

%Vor%

GCC 4.7.1 gibt mir einen ähnlichen Fehler in seinen Hash-Map-internen Strukturen so klar, ich mache es falsch, aber dies ist mein erster Ausflug in Allokatoren in der STL und ich bin ratlos.

Der benutzerdefinierte Zuordner folgt: Es ist eine einfache Implementierung mit einigen Lücken, aber diese Version funktioniert gut in einem Testfall mit einigen Mega Daten in Vektoren und Strings.

%Vor%     
zenmumbler 07.07.2013, 23:39
quelle

1 Antwort

8

Ich glaube, der Grundfehler ist, dass krystal_alloc ein "Converting Constructor" fehlt:

%Vor%

Ich bin mir nicht sicher, ob ich es richtig umgesetzt habe, das ist nur meine beste Schätzung. Sie benötigen eine Friend-Anweisung, damit dies funktioniert:

%Vor%

Ich empfehle auch, dass Sie "const" zum key_type in Ihren Zuweisungen für unordered_map hinzufügen:

%Vor%

Und ich denke , dass Sie lake_alloc anstelle von mm_alloc auf Ihren inneren Containern verwenden können. Ihr Beispiel kompiliert für mich beide Wege. Ich habe es nicht auf Laufzeitverhalten getestet.

    
Howard Hinnant 12.07.2013, 18:39
quelle

Tags und Links