vector vs. eingebautes array
-
string Werte[24]; // macht gleich 24 strings in den Speicher vector<string> werte; // macht das nicht.
-
vector<string> werte(24); // macht das
-
Ich sach doch, es gibt keinen Grund vector nicht zu benutzen. Aber wenn ihr gerne für diese Erkenntnis lieber über eine Seite diskutieren wollt, bitte. :p
-
Chew-Z schrieb:
Wird höchste Zeit den Hauptspeicher von 640 KB auf 2MB aufzurüsten.
Blödsinn, mehr als 640K braucht doch niemand.
-
Artchi schrieb:
std::vector ist IMMER dem C-Array vorzuziehen! Es gibt keinen Grund vector nicht zu benutzen.
falsch.
-
volkard schrieb:
Artchi schrieb:
std::vector ist IMMER dem C-Array vorzuziehen! Es gibt keinen Grund vector nicht zu benutzen.
falsch.
sehe ich auch so. vector benutzt doch den heap ne? wenn man das nicht will ist vector nicht das richtige
-
net schrieb:
volkard schrieb:
Artchi schrieb:
std::vector ist IMMER dem C-Array vorzuziehen! Es gibt keinen Grund vector nicht zu benutzen.
falsch.
sehe ich auch so. vector benutzt doch den heap ne? wenn man das nicht will ist vector nicht das richtige
Naja, das hat damit wohl aber nix zu tun. Wenn die Arraygröße defintiv feststeht, und sich auch nich ändern wird (sofern man das absehen kann) spricht natürlich auch nichts dagegen, ein normales Array zu benutzen.
-
Naja, das hat damit wohl aber nix zu tun. Wenn die Arraygröße defintiv feststeht, und sich auch nich ändern wird (sofern man das absehen kann) spricht natürlich auch nichts dagegen, ein normales Array zu benutzen.
Wer gerne die Indexprüfung des vectors nutzen will, wird wohl kein Array
nutzen, auch "wenn sich nicht ändern wird".
-
net schrieb:
volkard schrieb:
Artchi schrieb:
std::vector ist IMMER dem C-Array vorzuziehen! Es gibt keinen Grund vector nicht zu benutzen.
falsch.
sehe ich auch so. vector benutzt doch den heap ne? wenn man das nicht will ist vector nicht das richtige
Es gibt afaik die Möglichkeit, sich seinen eigenen Allokator zu schreiben. Aber wer macht das schon?
Ansonsten sehe ich es ähnlich. Pauschal zu sagen, dass std::vector immer vorzuziehen ist, ist imo falsch. std::vector ist nunmal mehr als nur ein simples Array, und diese erweiterte Funktionalität ist nicht immer erwünscht.
Ich würde eher sagen, dass man sowas wie boost::array einem built-in Array vorziehen sollte.
-
Anders ist es vielleicht treffender formuliert. Es gibt IMHO niemals irgendeinen Grund, ein rohes C-Array zu verwenden. C-Arrays sind eines der lamesten und schlechtesten und hässlichsten Sachen, die ich überhaupt kenne.
Wenn man sich wirklich gegen nen std::vector entscheidet, sollte man wenigstens statt nem C-Array boost::array nehmen.
-
Optimizer boost::array bringt doch kaum Vorteile. Noch nicht mal ein Range-Check im operator[]. boost::array hat nur Vorteile wenn man Arrays zusammen mit anderen STL Sachen benutzen will.
-
Kaum Vorteile??
- Iteratoren
- Die Möglichkeit, nen Indexcheck selber einzubauen
- kann man schöner als Referenz übergeben
- kannst size abfragen.Und keine Nachteile.
-
Und keine Nachteile.
Doch. Abhängigkeit von Boost.
-
Nimmst du Quelltext, machen du strg + a, c, v und haben keine Abhängigkeit von boost.
-
Manche Leute denken echt zu kompliziert.
-
finix schrieb:
Ben04 schrieb:
finix schrieb:
Ingo schrieb:
aber ein vector hat riesigen Overhead.
Ja? Das hört sich interessant an. Wärest du so nett deine Messungen mal zu posten?
Was gibt es da zu messen? Der vector hat mehr Speicher reserviert als du brauchst => Speicherverschwendung.
Ja? Wird ja ständig interessanter. Würde trotzdem fast vermuten dass du mit einem Array IMMER den maximal benötigten Speicher reserviert hast. Mit dem vector nicht. Und da der maximal benötigte Speicher bekannt ist wirst du auch mit dem vector nicht mehr Speicher reserviert haben als du brauchst.
vector fordert IMMER mehr Speicher an denn der vector gross ist um zu verhindern, dass das Array neu angelegt werden muss wenn man nur ein Element am Ende anhängt. Ein C-array hingegen ist immer genau so groß wie man gefordert hat
-
Dann rüste mal endlich deinen Hauptspeicher von 640 KByte auf auf ein paar MByte auf. Ist heute nämlich ganz preiswert.
Was verbraucht denn vector so? Es reserviert ja nicht 1 MByte an, sondern je nach Implementierung unterschiedlich. vector von VC++7.1 reserviert zu Anfang garnichts. Wenn ich vier push_back() mache, hat er nur 4 (vier!) Felder reserviert. Mache ich ein reserve(100) hat er tatsächlich 100 Felder belegt. Also genau das, was ich auch mit einem C-Array machen würde. Könnt ihr mit capacity() abfragen.
Aber mir egal... macht doch was ihr wollt.
-
Artchi schrieb:
Was verbraucht denn vector so?
Man spricht von etwa faktor 2 bei alten stls und bei 1,5 bei neuen.
dh, wenn dein vector 100 elemente beinhaltet, hat er einen worstcase verbrauch von sizeof(element)*200das problem sind aber die dynamischen speicher anforderungen, die manchmal einfach unnoetig sind.
Wenn ich vier push_back() mache, hat er nur 4 (vier!) Felder reserviert.
Dann schmeiss diese implementierung weg. so ists ja viel zu lahm.
es sei denn du hast zufaellig mit 4 die kapazitaet ideal ausgelastet, dann teste mal mit 5 elementen.aber ich glaube ganz ehrlich, dass du die problematik hier nicht verstehst. niemand sagt dass vector schlecht ist, aber es ist bloedsinn vector zu verwenden wenn boost::array den job besser machen wuerde.
-
Ben04 schrieb:
finix schrieb:
Ben04 schrieb:
finix schrieb:
Ingo schrieb:
aber ein vector hat riesigen Overhead.
Ja? Das hört sich interessant an. Wärest du so nett deine Messungen mal zu posten?
Was gibt es da zu messen? Der vector hat mehr Speicher reserviert als du brauchst => Speicherverschwendung.
Ja? Wird ja ständig interessanter. Würde trotzdem fast vermuten dass du mit einem Array IMMER den maximal benötigten Speicher reserviert hast. Mit dem vector nicht. Und da der maximal benötigte Speicher bekannt ist wirst du auch mit dem vector nicht mehr Speicher reserviert haben als du brauchst.
vector fordert IMMER mehr Speicher an denn der vector gross ist um zu verhindern, dass das Array neu angelegt werden muss wenn man nur ein Element am Ende anhängt. Ein C-array hingegen ist immer genau so groß wie man gefordert hat
Oh, ich verstehe. Du legst einen vector mit einer Kapazität von 24 Elementen an und der vector reserviert heimlich noch mehr Speicher, hm? Willst du mich eigentlich vera****** oder weisst du es einfach nicht besser?
Ich will ja nicht dogmatisch behaupten das man IMMER einen vector nehmen sollte - wenn die Anforderung z.B. konstant bei 24 liegt ist ein array völlig OK - aber meistens ist das ganz einfach der Fall.
-
finix schrieb:
Ben04 schrieb:
finix schrieb:
Ben04 schrieb:
finix schrieb:
Ingo schrieb:
aber ein vector hat riesigen Overhead.
Ja? Das hört sich interessant an. Wärest du so nett deine Messungen mal zu posten?
Was gibt es da zu messen? Der vector hat mehr Speicher reserviert als du brauchst => Speicherverschwendung.
Ja? Wird ja ständig interessanter. Würde trotzdem fast vermuten dass du mit einem Array IMMER den maximal benötigten Speicher reserviert hast. Mit dem vector nicht. Und da der maximal benötigte Speicher bekannt ist wirst du auch mit dem vector nicht mehr Speicher reserviert haben als du brauchst.
vector fordert IMMER mehr Speicher an denn der vector gross ist um zu verhindern, dass das Array neu angelegt werden muss wenn man nur ein Element am Ende anhängt. Ein C-array hingegen ist immer genau so groß wie man gefordert hat
Oh, ich verstehe. Du legst einen vector mit einer Kapazität von 24 Elementen an und der vector reserviert heimlich noch mehr Speicher, hm? Willst du mich eigentlich vera****** oder weisst du es einfach nicht besser?
23.2.4
A vector is a kind of sequence that supports random access iterators. In addition, it supports (amortized) constant time insert and erase operations at the end;.
Wenn du es schaffst eine Implementirung zu schreiben die (in den meisten Fällen) konstant schnell am Ende anfügen kann und dann noch random access Iterators zur Verfügung stellt (verkettete Listen scheiden aus) und nicht mehr Speicher verbraucht als von den Elementen verbraucht wird (verkettete Listen und Bäume scheiden aus) dann Hut ab.
aber ich glaube ganz ehrlich, dass du die problematik hier nicht verstehst. niemand sagt dass vector schlecht ist, aber es ist bloedsinn vector zu verwenden wenn boost::array den job besser machen wuerde.
Genau, vector ist ein Array das dafür gebaut ist seine Größe zu verändern. Fals die Größe bekannt ist dann gibt es besseres.
Hier muss allerdings gesagt werden, dass es gibt Situation in denen boost::scoped_array boost::array vorzuziehen ist. boost::array legt die Daten in der Klasse ab, also auf dem Stack. Dies kann bei großen Arrays schonmal zu einem Stackoverflow führen. Meiner Meinung fehlt noch eine Spezialisirung für sizeof(T)*N>256.