Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Wie kommst du jetzt grad darauf?Ein std::vector aus std::vector ist keine gute Lösung für ein zweidimensionales Array. Verwend besser einen einfachen eindimensionalen std::vector in dem du deine zweidimensionalen Daten z.B. zeilenweise speicherst...
Also verwirr die Anfänger doch nicht mit optimierungs Problemen.Zitat
Premature optimization is the root of all evil.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (11.08.2012, 20:38)
Wie kommst du jetzt grad darauf?Ein std::vector aus std::vector ist keine gute Lösung für ein zweidimensionales Array. Verwend besser einen einfachen eindimensionalen std::vector in dem du deine zweidimensionalen Daten z.B. zeilenweise speicherst...
Es mag zwar nicht sehr schön aussehen und ist ohne Iteratornutzung evtl. etwas weniger performant als ein wirkliches 2D Array, aber für einen kleinen Datensatz spielt dies alles keine Rolle.
Du kennst ja sich das bekannte Zitat:
Zitat
Premature optimization is the root of all evil.
Also verwirr die Anfänger doch nicht mit optimierungs Problemen.
Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von »dot« (08.08.2012, 21:16)
Prinzipien haben immer einen Hintergrund und der einzige Grund, warum jagged Arrays nicht gut sind, ist weil es nicht sehr performant für die CPU bzw. deren Cache ist und darum die ganze Zeit Daten vom langsamen RAM angefordert werden müssen.Wie gesagt, handelt es sich da imo nicht einfach um ein Optimierungsproblem, sondern um etwas Prinzipielles...
Wieso sollte dann ein eindimensionales Array von der Struktur her besser sein für das Problem?Der Grund, wieso ich davon abrate, ist in erster Linie, dass es strukturell nicht dem zu lösenden Problem entspricht.
Prinzipien haben immer einen Hintergrund und der einzige Grund, warum jagged Arrays nicht gut sind, ist weil es nicht sehr performant für die CPU bzw. deren Cache ist und darum die ganze Zeit Daten vom langsamen RAM angefordert werden müssen.
Wieso sollte dann ein eindimensionales Array von der Struktur her besser sein für das Problem?Der Grund, wieso ich davon abrate, ist in erster Linie, dass es strukturell nicht dem zu lösenden Problem entspricht.
Für den Vorschlag wäre es evtl. für Anfänger noch hilfreich, wenn du ein Beispiel geben kannst, weil "Verwend besser einen einfachen eindimensionalen std::vector in dem du deine zweidimensionalen Daten z.B. zeilenweise speicherst..." sagt ja jetzt wirklich nicht viel aus.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (08.08.2012, 21:56)
Die STL wurde so entworfen, dass die Verwendung von dessen Containern keinen grossen Einfluss auf die Laufzeit oder den Speicher hat. Obwohl es natürlich in den meisten Fällen keinen Sinn macht std::map's zu verschachtel, so werden die Prinzipien von C++ damit nicht verletzt.Mit dem gleichen Argument könnte man auch eine verschachtelte std::map verkaufen...
Zitat von »dot«
Das sind alles Gründe, aber nicht die einzigen. Ein imo noch viel wichtigerer Grund ist, dass jagged Arrays vergleichsweise sehr viel komplizierter sind als normale Arrays. Wieso sollte man eine kompliziertere einer sehr viel einfacheren Lösung vorziehen, wenn die einfachere sogar auch noch effizienter ist!?
Ich möchte unserem Anfänger eben die Chance geben, selbst zu denken und dabei wirklich was zu lernen anstatt vorgekaute Brocken zu kopieren. Für mich war genau diese Arraygeschichte damals eine sehr wichtige Erkenntnis...
Wie bist du jetzt wieder von einem eindimensionalen Array, wie vorgeschlagen in deinem ersten Post, auf ein zweidimensionales Array gekommen? Und wieso ist ein zweidimensionales Array besser als ein zweidimensionaler std::vector?Weil das Problem zweidimensionaler Natur ist und ein zweidimensionales Array hier die einfachste, intuitivste und effizienteste mir bekannte Lösung ist.Zitat von »eXpl0it3r«
Zitat von »dot«
Der Grund, wieso ich davon abrate, ist in erster Linie, dass es strukturell nicht dem zu lösenden Problem entspricht.
Wieso sollte dann ein eindimensionales Array von der Struktur her besser sein für das Problem?
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »eXpl0it3r« (08.08.2012, 22:32)
dot, da ich mich für solche Design Prinzipien sehr interessiere, wäre ich froh wenn du das Ganze etwas ausführen könntest, weil bis jetzt habe ich noch nie gehört, dass zweidimensionale std::vector im Allgemeinen eine schlechte Datenstruktur ist.
Auch bin ich mir über deine Definition/Vorstellung von Jagged Array nicht ganz bewusst, Google lieftert mir da eigentlich nur Artikel zu C#.
Quellcode |
|
1 2 3 4 5 6 7 |
TTTTTTTTTTTTTTTTTTTT TTTT TTTTTTT TT TTT T |
Quellcode |
|
1 2 3 4 5 6 7 |
TTTTTTTTTTTTTTTTTTTT TTTTTTTTTTTTTTTTTTTT TTTTTTTTTTTTTTTTTTTT TTTTTTTTTTTTTTTTTTTT TTTTTTTTTTTTTTTTTTTT TTTTTTTTTTTTTTTTTTTT TTTTTTTTTTTTTTTTTTTT |
Die STL wurde so entworfen, dass die Verwendung von dessen Containern keinen grossen Einfluss auf die Laufzeit oder den Speicher hat. Obwohl es natürlich in den meisten Fällen keinen Sinn macht std::map's zu verschachtel, so werden die Prinzipien von C++ damit nicht verletzt.Mit dem gleichen Argument könnte man auch eine verschachtelte std::map verkaufen...
Ich kann hier zwar meistens nur Behauptungen aufstellen, weil ich nicht den Standard gelesen habe, aber ich vertraue darauf, dass die Implementierungen von der STL und die Optimierungen von den Compilers die beste Performance für den gegebenen Code generieren.
Das Problem mit dem CPU Cache tritt eigentlich nur auf, wenn man falsch durch ein mehr dimensionales Array iteriert, sprich zuerst die Zeilen und dann die Spalten.
Wie bist du jetzt wieder von einem eindimensionalen Array, wie vorgeschlagen in deinem ersten Post, auf ein zweidimensionales Array gekommen? Und wieso ist ein zweidimensionales Array besser als ein zweidimensionaler std::vector?Weil das Problem zweidimensionaler Natur ist und ein zweidimensionales Array hier die einfachste, intuitivste und effizienteste mir bekannte Lösung ist.Zitat von »eXpl0it3r«
Zitat von »dot«
Der Grund, wieso ich davon abrate, ist in erster Linie, dass es strukturell nicht dem zu lösenden Problem entspricht.
Wieso sollte dann ein eindimensionales Array von der Struktur her besser sein für das Problem?
Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von »dot« (09.08.2012, 03:44)
Zja der Standard sagt aber etwas anderes über mehrdimensionale Arrays:Zitat von »dot«
Richtig, wenn man von einem entsprechend großen, mehrdimensionalen Array in column major Memory Layout ausgeht. Ein std::vector aus std::vector ist nur eben etwas völlig anderes...
Ich meinte ein herkömmliches zweidimensionales Array, das üblicherweise eben über eine bijektive Abbildung zweidimensionaler Indices in einen zusammenhängenden eindimensionalen Speicherbereich implementiert wird...
Das heisst somit, dass ein zweidimentionales Array (Bsp. int a[10][10];) ebenfalls einen fragmentierten Speicherbereich aufweist.Zitat von »ISO/IEC 14882-2011 § 8.3.4-7«
A consistent rule is followed for multidimensional arrays. If E is an n-dimensional array of rank i×j ×. . .×k, then E appearing in an expression that is subject to the array-to-pointer conversion (4.2) is converted to a pointer to an (n−1)-dimensional array with rank j ×. . .×k. If the * operator, either explicitly or implicitly as a result of subscripting, is applied to this pointer, the result is the pointed-to (n − 1)-dimensional array, which itself is immediately converted into a pointer.
idontknow
unregistriert
Das bringt genau nichts, da std::array genau so fragementierte Speicherbereiche hat...std::tr1::array<std::tr1::array<T, Width>, Height>. So einfach. Diskussion vorbei.
Hier noch eine weitere Referenzdazu.edit: fürn TE: http://msdn.microsoft.com/en-us/library/bb983093.aspx
idontknow
unregistriert
Werbeanzeige