std::list und std:vector
-
Hallo
Ich habe jetzt mit Vector sowie mit List gearbeitet und möchte jetzt wissen, wer von den beiden beim Erstellen schneller ist, da ich mit sehr vielen kleinen kurzlebigen Feldern arbeite...
MfG, EOutOfResources
-
EOutOfResources schrieb:
Ich habe jetzt mit Vector sowie mit List gearbeitet und möchte jetzt wissen, wer von den beiden beim Erstellen schneller ist, da ich mit sehr vielen kleinen kurzlebigen Feldern arbeite...
Beim Erstellen von was? Unter welchen Nebenbedingungen?
-
Nexus schrieb:
EOutOfResources schrieb:
Ich habe jetzt mit Vector sowie mit List gearbeitet und möchte jetzt wissen, wer von den beiden beim Erstellen schneller ist, da ich mit sehr vielen kleinen kurzlebigen Feldern arbeite...
Beim Erstellen von was? Unter welchen Nebenbedingungen?
list<int> bar; bar.push_back(354); bar.~list();Erstellen einer Liste/eines Vektores und hinzufügen von Elementen. Soviel zum Erstellen.
Was meinst du für Nebenbedingungen?
-
Das einfügen macht prinzipiell keinen Unterschied. Wähle die Struktur anhand der häufigen Zugriffe (random access oder nicht).
Anhand dieser Faustregeln kannst du die Auswahl machen.
-
-
EOutOfResources schrieb:
bar.~list();Mach das schnell weg, bevor alles verbrennt!

-
Nexus schrieb:
EOutOfResources schrieb:
bar.~list();Mach das schnell weg, bevor alles verbrennt!

Es sollte doch den Speicher freigeben, nicht?
-
EOutOfResources schrieb:
Es sollte doch den Speicher freigeben, nicht?
Vielleicht solltest du dich mal mit Scopes, und Destruktoren nochmals auseinander setzen.
Eine Variable die auf dem Stack erzeugt wird, wird automatisch am Ende ihres Gültigkeitsbereiches aufgeräumt. Im Falle von Objekten wird dabei der Destruktor aufgerufen. In der Regel ruft man den Destruktor nicht selbst auf (es gibt zwar Anwendungsfälle, diese sind aber sehr, sehr speziell).
Und selbst bei Objekten auf dem Heap ruft man in der Regel keinen Destruktor manuell auf (das erreicht man indirekt über delete).
-
Der Destruktor wird automatisch aufgerufen, das ist ja der Sinn von RAII.
Einen expliziten direkten Destruktoraufruf benötigst du fast nie. Verwendest du ihn dennoch, kann alles verbrennen (undefiniertes Verhalten).
-
drakon schrieb:
Das einfügen macht prinzipiell keinen Unterschied. Wähle die Struktur anhand der häufigen Zugriffe (random access oder nicht).
Klar macht das Einfügen auch nen Unterschied.
Steck mal 1 Mio. ints in einen std::vector<int> und dann in eine std::list<int>. Und dann guck mal was schneller ist.std::list braucht für jedes einzelne push_back 1x new (und entsprechend 1x delete wenn das Gedöns wieder zerstört wird).
std::vector kommt dagegen mit O(log N) new/delete für N mal push_back aus.Dafür muss std::vector mehr umkopieren -- wenn man nicht vorher reserver() verwendet.
Bei billig zu kopierenden Objekten ist std::vector der klare Gewinner - zumindest so lange es nur ums Einfügen-am-Ende geht.
-
@hustbaer:
Das ist mir bewusst, aber mein Punkt war, dass er die Auswahl der Struktur nicht von so etwas abhängig macht, sondern zuerst einmal die Zugriffe anschaut. Was effektiv schneller ist sollte man, wie du sagst einmal für den speziellen Fall testen. Wenn man die Container so auswählt, dass sie ihren Einsatzgebiet entsprechen, dann bekommt man üblicherweise auch das optimalste für den Fall.
Darum meinte ich prinzipiell, weil es doch sehr abhängig vom konkreten Fall ist.
