C++ welcher Container?

Gast #5312467
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
#5312482
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.
Gast #5312505
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.
#5312527
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.