initialisiert eine STL 'map' Größe

8

ist es möglich, eine STL map size zu initialisieren?

Ich weiß, wie viele Elemente in meiner Map am Ende sein werden und ich möchte den gesamten benötigten Speicher ganz am Anfang zuweisen.

    
MBZ 09.11.2012, 00:47
quelle

4 Antworten

6

Es gibt mehrere Möglichkeiten:

  • Sie können versuchen, eine Karte mit einem State Allocator zu verwenden. Zum Beispiel von Boost.Container oder von C ++ 11. Oder wenn Sie Einschränkungen von nicht-zustandigen Allokatoren akzeptieren, können Sie sogar die Karte aus C ++ 98/03 verwenden.

  • Erwägen Sie, unordered_map (wieder von Boost oder von C ++ 11) zu verwenden - es dauert Eimer zählen als Konstruktor Parameter. Es unterscheidet sich von der Karte dadurch, dass es auf Hashing und nicht auf strikt schwacher Ordnung basiert.

  • Eine weitere Option ist flat_map von Boost . Es hat reserve Member-Funktion. Beschreibung der flachen Karte / Menge:

  

Boost.Container flat_ [multi] map / set-Container sind geordnete vektorbasierte assoziative Container, die auf den Richtlinien von Austern und Alexandrescu basieren.

  • Oder, wenn Boost nicht verfügbar ist - dann könnten Sie einfach std :: vector + std :: sort + std :: lower_bound verwenden (oder sie in eine kleine flat_map-ähnliche Klasse umhüllen). I.e. Setze deine Elemente einfach in den Vektor (ungeordnet), sortiere sie und dann - wenn du Element für Schlüssel abfragen musst - benutze einfach lower_bound.

Welche Wahl besser ist - hängt von Ihren Nutzungsmustern ab.

    
Evgeny Panasyuk 09.11.2012, 00:54
quelle
4

Sie können nicht. Es ist ein Baum (normalerweise ein rot-schwarzer Baum). Die tatsächlichen Werte bestimmen das Speicherlayout.

Allerdings können Sie

  • Verwenden Sie Boost Intrusive Maps (die von Ihnen zugewiesene Elemente verwenden) in einem anderen Container, wie ein Vektor), mit 'Haken' dekoriert, um die Kartenfunktionalität darüber zu implementieren

  • verwenden Sie std :: map mit Zuweisungsmitteln, damit Sie alle tatsächlichen Elemente aus einem festen 'Pool' (Speicherbereich) zuordnen können

sehe 09.11.2012 00:51
quelle
1

Das einzige, was mir einfällt, ist die Verwendung seiner Iterator-Konstruktoren. Der einzige Trick besteht darin, dass Sie dann einen anderen Container mit der benötigten Größe erstellen müssen und seine Iteratoren dem Konstruktor geben müssen.

    
AJMansfield 09.11.2012 00:53
quelle
0

reserve kann von rehash wie in Tabelle 103 in N3376 .

%Vor%

Quelle

    
Brian Cain 09.11.2012 00:53
quelle

Tags und Links