Forum: PC-Programmierung C++ welcher Container?


von HighSpeed (Gast)


Lesenswert?

Hallo,

ich habe ein Struct welches als Datentyp in ein Container soll welcher 
beliebig viele Elemente enthalten kann und durch Indexierung ansprechbar 
sein sollte.

Was mir direkt in den Sinn kommt ist unordered_map oder ein vector.
1
std::unordered_map<int,mein_struct> mapOfStruct;
1
std::vector<mein_struct> vectorOfStruct;

Angenommen es gibt Beispielsweise 10000 Einträge und auf den Container 
wird zufällig und sehr häufig per index [] zugegriffen.
Meine Frage wäre: welche Variante hat den schnelleren Zugriff? Oder gibt 
es gar andere äussere Container die noch schneller auf die Inhalte des 
Structs zugreifen als die genannten?

Danke vorweg && Grüße

von Jim M. (turboj)


Lesenswert?

HighSpeed schrieb:
> Meine Frage wäre: welche Variante hat den schnelleren Zugriff?

Schneller als ein Array Zugriff bei Lesen von std::vector geht es nicht.

Allerdings kann das Anfügen eines Elements an den Vektor länger dauern, 
wenn nämlich das Array vergößert werden muss.

Die interessante Frage ist: Hast Du Lücken im Index? Das geht nämlich 
nur mit std::unordered_map.

von HighSpeed (Gast)


Lesenswert?

Lücken hab ich keine daher ist vector auch möglich.
Das Anfügen also push_back solle auch kein Problem sein da im Vorfeld 
fest steht wie groß der Container ist, könnte ich dann mit reserve() 
vorbereiten.

Ich dachte immer vector sowie unordered_map kosten beide O(1) daher war 
ich mir nicht sicher.

von Sebastian V. (sebi_s)


Lesenswert?

HighSpeed schrieb:
> Ich dachte immer vector sowie unordered_map kosten beide O(1) daher war
> ich mir nicht sicher.

Ist auch richtig. Allerdings nutzt unorderd_map intern eine Hashtabelle. 
Dein Index muss also erstmal gehasht werden und dann im entsprechenden 
Bucket nachgeschaut werden. Das ist doch etwas aufwändiger als ein 
einfacher Array Zugriff für den einige CPU Architekturen schon spezielle 
Instructions haben.

von HighSpeed (Gast)


Lesenswert?

Verstehe, danke für die Erklärung, dann werde ich den vector nehmen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.