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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

28.11.2012, 11:57

Nun, mit der Empfehlung std::vector für dynamische Arrays und std::array für statische Arrays einzusetzen kann ich mich anfreunden. std::array hilft in der Tat die vielen Stolperfallen herkömmlicher Arrays zu vermeiden. Einfach vergessen sollte man die herkömmlichen Arrays imo aber dennoch nicht, denn zumindest in fremdem Code wird man sie früher oder später oft antreffen...

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

12

28.11.2012, 12:29

Ich verstehe Deine Argumentation. Ich kann mir zwar nur schwer vorstellen, dass jemand aus Versehen den std::vector vergrößert - sowas braucht schon Vorsatz. Ich halte Zugriffe mit ungültigen Indizes für den wahrscheinlicheren Fehler. Und da hat std::vector einen schönen Fehlertest drin, während manuelle Arrays das einfach durchgehen lassen. Ich stimme euch aber zu: std::array ist aber eine schöne Kombination aus allen Vorteilen in diesem Fall.
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.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

13

28.11.2012, 12:42

std::array hat auch den Vorteil, dass man damit Arrays by Value übergeben kann.
Ein Array ist dann einfach nur noch ein ganz normales Objekt und nicht sowas Komisches, das in C(++) irgendwie eine Sonderstellung hat.

Pixel-Wizard

Frischling

  • »Pixel-Wizard« ist der Autor dieses Themas

Beiträge: 33

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

14

28.11.2012, 18:30

Zuerst einmal vielen Dank für die vielen Antworten. Ihr seit super!!!

Ich habe mir mal die Beiträge durchgelesen und fasse hier kurz zusammen was ich aus all den Tipps wirklich anwende bzw. was am überzeugensten war.


Also die dynamischen Arrays sollte man ganz vergessen und dafür std::vector anwenden. std::array ist im Grunde das gleiche wie std::vector einfach anders aufgebaut und mit ein paar veränderten bzw. hinzugefügten oder auch fehlenden Funktionen.

Kurz und bündig: Dynamische Arrays :thumbdown: , std::array :thumbup: , std::vector :thumbsup:

Nochmals danke für alle Antworten

MfG Pixel-Wizard
Träume werden wahr, wenn du sie war werden lässt.


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

15

28.11.2012, 19:10

Halt. Ein Array ist von Haus aus nicht dynamisch. Du müsstest, wenn du eine dynamische Anzahl an Elementen haben willst die Größe selbst verändern. Von daher, wenn die Größe veränderbar sein soll, benutz std::vector und wenn die Größe konstant ist, benutz std::array.
Normale Arrays solltest du aber trotzdem kennen und sie auch wenigstens mal testweise benutzt haben. Irgendwann kommt es halt dazu, dass du Code von jemandem siehst der sie benutzt und sie dann nicht zu kennen ist unschön. Kompliziert sind sie ja eigentlich auch nicht.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Pixel-Wizard

Frischling

  • »Pixel-Wizard« ist der Autor dieses Themas

Beiträge: 33

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

16

28.11.2012, 19:20

Ja das ist natürlich schon klar. Mit vergessen meine ich einfach nicht mehr anwenden. Die Arrays zu vergessen kann man sich ja gar nicht leisten da std::vector ja auf der Grundlage von Arrays aufgebaut ist.
Träume werden wahr, wenn du sie war werden lässt.


drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

17

28.11.2012, 19:58

Also die dynamischen Arrays sollte man ganz vergessen und dafür std::vector anwenden.

Genau. Wenn es reine Benutzung in alltäglichem Code ist, dann ja.

Zitat

std::array ist im Grunde das gleiche wie std::vector einfach anders aufgebaut und mit ein paar veränderten bzw. hinzugefügten oder auch fehlenden Funktionen.

Nicht ganz. Ein std::array ist eher etwas wie ein normales (nicht-dynamisches) array. Es bietet aber eben STL-Kompatibilität, Kopierbarkeit etc. an.

Zur Laufzeit ist die Benutzung eines std::array äquivalent zu einem normalen array. Der Unterschied ist, dass der Programmierer weniger denken und aufpassen muss. Ein std::vector hat einen minimalen Mehraufwand bei dem Zugriff auf ein Element. Das ist jetzt nichts, was auf den Entscheid zwischen std::array und std::vector einen Unterschied machen sollte, aber fürs Verständnis kann das wichtig zu wissen sein.

Innen drin ist ein std::array in etwa das hier:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
template<class T, int n>
class myArray
{
public:
 ... // nützliche Funktionen
private:
 T[n] m_Data; // statisches array
};


ein std::vector das hier:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
template<class T>
class myVector
{
public:
 ... // nützliche Funktionen
private:
 T* m_Data; // dynamisches array
};


Ich hoffe der Unterschied ist jetzt klar, sonst einfach nochmal nachhaken!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

28.11.2012, 20:01

Btw: Wenn man schnell mal ein dynamisches Array unveränderlicher Größe braucht, kann man einfach std::unique_ptr verwenden:

C-/C++-Quelltext

1
2
3
std::unique_ptr<int[]> my_stuff(new int[1234]);

my_stuff[42] = 23;

Pixel-Wizard

Frischling

  • »Pixel-Wizard« ist der Autor dieses Themas

Beiträge: 33

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

19

28.11.2012, 21:00

Wow!

Von wo wisst ihr das alles?

Jetzt ist mir der Unterschied sicher klar vielen Dank. Das mit dem vektor sieht schon komplizierter aus aber ist wenn man es genauer unter die Lupe nimmt eigentlich logisch.
Träume werden wahr, wenn du sie war werden lässt.


drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

20

28.11.2012, 21:32

Btw: Wenn man schnell mal ein dynamisches Array unveränderlicher Größe braucht, kann man einfach std::unique_ptr verwenden:

C-/C++-Quelltext

1
2
3
std::unique_ptr<int[]> my_stuff(new int[1234]);

my_stuff[42] = 23;

Macht aber auch nur Sinn, wenn die Grösse zur Kompilierungszeit nicht bekannt oder aber relativ gross ist. Ansonsten wäre das ein Fall für std::array.

Werbeanzeige