Du bist nicht angemeldet.

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

Pixel-Wizard

Frischling

  • »Pixel-Wizard« ist der Autor dieses Themas

Beiträge: 33

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

1

27.11.2012, 22:35

Vektoren anstatt Arrays

Hallo miteinander

Ich bim im Buch "C++ für Spieleprogrammierer" beim Kapitel über die "STL" angelangt. Das erste Subthema handelt davon was Vektoren sind und wie man diese einsetzt. Ich finde diese Vektoren sehr nützlich da sie einige Funktionen und Optionen mehr haben als die Arrays (dies steht auch im Buch).

Aus diesem Grund habe ich mich gefragt: Ist es sinnvoll wenn man die Arrays sozusagen vergisst und in Zukunft nur noch Vektoren benutzt?

Wenn nicht: Was gibt es denn bei den Arrays was Vektoren nicht können?

Ich hoffe auf viele nützliche Antworten :-)

Liebe Grüsse
Pixel-Wizard
Träume werden wahr, wenn du sie war werden lässt.


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

27.11.2012, 22:45

std::vector ist einfach eine schöne Klasse die new[] und delete[] kapselt. Ein std::vector allokiert seinen Speicher auf dem Heap, ein Array kannst du auch auf dem Stack anlegen. Ein Array kannst du dagegen nicht dynamisch in seiner Größe ändern. Verwend std::vector anstatt direkt mit new[] und delete[] zu hantieren.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

3

28.11.2012, 00:26

Pauschal kann man natürlich nicht sagen, dass man Arrays nicht verwenden sollte.

Sobald du dynamisch irgendwelche Objekte verwaltest und sich die Zahl verändern kann, würde ich dir auf jeden Fall std::vector ans Herz legen, da dieser dafür wie geschaffen ist und der wahlfreie Zugriff genauso gegeben ist wie bei Arrays.

Wenn du ein Feld statischer Größe hast, welches möglicherweise auch noch mehrdimensional ist, und du an beliebigen Position in unterschiedlicher Reihenfolge Elemente einfügen willst, dann bevorzuge ich oft ein Array, da das, so finde ich, schneller hingeschrieben ist als verschachtelte Vektoren und das damit einhergehende n-fache Hinzufügen und entsprechende resize-Aufrufe.

Du solltest dir also überlegen, ob dein Array statisch oder dynamisch sein soll und gerade im dynamischen Fall std::vector verwenden. Im statischen Fall bietet sich dann auch C++11 an und die Verwendung von std::array

4

28.11.2012, 10:23

Ja, normale Arrays kannst du ruhig vergessen.
Ein std::vector hat zwar einen minimalen Mehrbedarf an Speicher (da z.b. die Größe mitgespeichert werden muss), der ist aber quasi immer vernachlässigbar. Für sehr kleine Arrays bietet es sich an direkt eine Struktur bzw. Klasse anzulegen. Anstatt eine Position beispielsweise ein einem float[3] zu speichern, solltest du lieber eine Klasse benutzen die dann ein x,y,z float beinhaltet und am besten noch ein paar Operatoren z.B. für die Addition hat. Sowas erhöht die Übersicht und erleichtert das Arbeiten.
std::array ist natürlich auch gute Möglichkeit, das umgeht auch viele Probleme die normale Arrays haben. Allerdings benutze ich diese Klasse nicht wirklich, da ich in der Regel entweder eine dynamische Anzahl an Objekten speichere, oder bei einer festen jedes einzelne sinnvoll benennen kann.
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

28.11.2012, 10:35

D.h. wenn du z.B. eine Lookuptable mit 256 Einträgen brauchst, dann legst du alle 256 Elemente als einzeln benannte Objekte an? Würd mich interessieren, wie genau du dann darauf zugreifst... ;)

6

28.11.2012, 11:10

Ok, Lookuptable ist ein schönes Beispiel für einen sinnvollen std::array Einsatz, da die Größe beim Kompilieren in der Regel feststeht. Aber mir fällt gerade keine Stelle in einen meiner Projekte ein, wo ich soetwas benutze, meistens ist die Größe variabel, oder klein und fix.
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

28.11.2012, 11:18

Spielbrett beim Schach
Tetris
Pointer auf die Kinder eines Octree Node
...

Imo kann man jedenfalls nicht sagen, dass man normale Arrays vergessen sollte. ;)

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

8

28.11.2012, 11:27

Doch, normale Arrays sollte man vergessen. Wir reden hier ja von Menschen, die eher am Anfang der Programmiererkarriere stehen. Da würde ich auch bei Schach und Tetris zu std::vector raten. Der Octree-Node ist dagegen diskutabel... der Nachteil eines std::vector ist ja, dass er immer dynamisch allokiert. Bei vielen tausenden Octree-Nodes kann sich das in der Performance bemerkbar machen. Dann empfiehlt sich tatsächlich std::array. Für Schach oder Tetris ist das dagegen völlig wurscht, und man wird durch das Interface ein bisschen mehr vor Dummheiten bewahrt.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

28.11.2012, 11:29

Was genau ist deiner Meinung nach der Nachteil eines normalen Array in den oben genannten Beispielen? Imo haben Arrays dort nur Vorteile, allem voran, dass sie einfacher sind. Abgesehen davon ist std::vector imo rein konzeptionell der völlig falsche Datentyp für eine Struktur statischer Größe, denn das Interface gibt mir keine Möglichkeit, diesen Constraint zu forcieren. Anstatt zu sagen "Hier ist ein Array aus n Elementen", kann ich mit std::vector lediglich sagen "Hier ist ein Array mit einer zur Laufzeit bekannten Anzahl an Elementen". Dass es sich immer um genau n Elemente handeln muss ist plötzlich nurmehr eine implizite Annahme, die sich zwar durch den ganzen Code zieht, die zur Compiletime aber nicht überprüft werden kann. Für den Preis einer zusätzlichen Indirektion und dynamischen Speicherallokation hat std::vector uns hier alles komplizierter und fehleranfälliger gemacht...

Für dynamische Arrays ist auf jeden Fall std::vector zu empfehlen. Für Arrays konstanter, zur Compilezeit bekannter Größe aber imo schon allein im Sinne der Typsicherheit auf keinen Fall, wenn dann std::array.

Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von »dot« (28.11.2012, 11:59)


10

28.11.2012, 11:41

Nur nochmal für Pixel-Wizard: Ich denke wir sind uns alle einig, dass man dynamisch Arrays zugunsten von std::vector vergessen sollte.

Für statische Arrays: Einen wirklichen Nachteil sehe ich nicht, aber std::array halt halt ein ähnliches Interface, wie std::vector, was nicht schlecht ist. Schwerer zu benutzen sind sie ja auch nicht, die Typdeklaration ist einfach nur leicht anders. Von daher, wieso sollte man nicht die mächtigere Variante benutzen, wenn diese keinerlei Nachteile hat?
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige