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

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

11

08.05.2012, 16:06

Ja, ich hatte nicht an den zusätzlichen Speicherzugriff gedacht. In der Hinsicht hast du recht. Aber grundsätzliches abraten ist blödsinn.
Wenn du sehr oft mitten in der Liste ein Element löschen oder einfügen musst hat sie einen Klaren performancevorteil.
Überleg mal was passieren muss, wenn mitten in einem Vector mit vielen Elementen ein Element in der Mitte löschst?

@BlueCobold: Eine solche Methode macht durchaus Sinn. Der einzige Weg ohne eine solche Methode eine Einheit hinzuzufügen wäre die Liste öffentlich zu machen. Ist das besser?
Ausserdem kann es sein, dass er später noch andere Dinge tut wenn eine neue Einheit hinzugefügt wird. Wenn er die Liste öffentlich hat und dieser Fall eintritt muss er unter umständen an vielen Stellen etwas ändern. Benutzt er gleich eine Methode ist er auf der sicheren Seite.
Bezüglich des Rückgabewertes stimm ich dir zu.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

12

08.05.2012, 16:18

Ich fand früher Listen auch ganz toll, nehme heute aber eigentlich std::vector als Standardcontainer. Es sei den, ich brauche etwas, von dem ich weiß, dass es andere Containerarten besser können.
Wichtig ist halt (wie immer), dass man weiß, was einem zur Verfügung steht und wo die jeweiligen Vor- und Nachteile liegen.
Lieber dumm fragen, als dumm bleiben!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

13

08.05.2012, 16:22

Hier, als unterstützendes Mittel zur Wahl eines Datencontainers :-)

(Link)
@D13_Dreinig

Käsekönig

1x Contest-Sieger

  • »Käsekönig« ist der Autor dieses Themas
  • Private Nachricht senden

14

08.05.2012, 18:41

Danke schon mal für die Antworten. :)
Ich hab zu std::list gegriffen, weil ich eben jedes beliebige Element der Liste einfach so löschen will. Wenn eine Einheit nicht mehr vorhanden ist, muss sie ja raus, wenn eine neue gebaut wird, kommt sie einfach in die Liste, ich dachte mir, damit wär ich recht flexibel.
Mir ist das mit der Geschwindigkeit noch nicht ganz klar. Wenn ich durch die Liste hindurch iteriere, spielt es dann eine Rolle, was in der Liste gespeichert ist? Ob das riesen Objekte sind, Zeiger auf solche Objekte, oder "einfache" Variablen? Es ist ja doch immer nur ein Sprung zum nächsten Element. Wenn große Objekte Nachteile hätten, dann sollte ich ja doch Zeiger speichern.

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

15

08.05.2012, 19:39

Ja, ich hatte nicht an den zusätzlichen Speicherzugriff gedacht. In der Hinsicht hast du recht. Aber grundsätzliches abraten ist blödsinn.
Wenn du sehr oft mitten in der Liste ein Element löschen oder einfügen musst hat sie einen Klaren performancevorteil.
Überleg mal was passieren muss, wenn mitten in einem Vector mit vielen Elementen ein Element in der Mitte löschst?

Ach mist, jetzt hatte ich hier so ne schöne Antwort geschrieben und dann ausversehen auf Backspace gedrückt während das Textfeld kein Focus hatte...

Naja nochmal in kurz: Wenn man viel in der Mitte einfügen und löschen will, nimmt man halt einen Vektor von Zeigern. Dann müssen zwar jedes mal ein paar Bytes herumgeschoben werden, in der Praxis wird das aber in den meisten Fällen immer noch schneller als die ganzen Miniallokationen und das "Pointerhangeln" von std::list sein.

Ein weiterer Nachteil von std::list ist übrigens, dass es intern für jedes Element ein Miniobjekt auf dem Heap allokieren muss. Wenn die Elemente der Liste groß sind fällt das zwar nicht so sehr ins Gewicht, dafür müssen dann aber alle Elemente einen Copyctor (oder zumindest Movector) bereitstellen, was bei großen Objekten häufig unakzeptabel ist. Alternativ müsste man dann eine Liste von Zeigern nehmen. Dann hat man aber eine doppelte unnötige Indirektion und viel Speicheroverhead. Wem das nicht stört kann auch gleich Java nehmen... ;)
Um diese Nachteile zu umgehen kann man die Liste einfach per Hand implementieren, aber ein Vektor von Zeigern dürfte bequemer und sicherer sein.
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

16

08.05.2012, 20:02

Ein weiterer Nachteil von std::list ist übrigens, dass es intern für jedes Element ein Miniobjekt auf dem Heap allokieren muss.


Das kann man mit einem Poolallokator allerdings ganz gut beschleunigen.
@D13_Dreinig

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

17

08.05.2012, 20:02

Das ist alles nichts neues für mich. Ändert aber nichts daran, dass man std::list nicht generell vermeiden soll.

@David: Dankeschön für den schönen link. :love:
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

18

09.05.2012, 07:14

Ich finde die das Flowchart auch sehr anschaulich. Das hat meiner Meinung nach einen Platz im Wiki verdient. Denn fragen um die STL-Container können doch öfter mal vor ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

19

09.05.2012, 08:21

Ich fürchte nur, dass diejenigen, die diesen Chart brauchen, weil sie solche Fragen stellen, auch mit dem Chart zum falschen Schluss kommen, weil sie irgendwo falsch abbiegen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

20

09.05.2012, 11:32

Auch wenn man die Container kennt und sich bewusst über ihre Vor- und Nachteile ist, ist das Flowchart dennoch schön anschaulich sein. Man könnte es noch ein bisschen erweitern aber soweit wirklich gut. Mein Vorschlag wäre, es ins Wiki zu tun und eine Seite anzulegen, wo die einzelnen Container nochmals beschrieben werden. Dazu muss man sich ja nicht Unmengen Text aus den Fingern saugen. Irgendjemand sucht ein Skript aus der Uni raus und kopiert die Texte dazu. Dann können die Texte ja hinterher nach und nach angepasst und soweit vereinfacht werden, bis jeder zufrieden ist. Datenstrukturen sind nun mal wichtig und als Entwickler sollte man sich ihrer bewusst sein. Das erspart viel Frust. Hab es schon oft erlebt dass mir ein Bekannter erzählt was er tolles in seinem Programm mit einem Array macht und dabei war es einfach eine Queue oder ein Stack.
Vielleicht hat ja jemand lust und Zeit so eine Seite anzulegen. Dumm wäre es sicherlich 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.“

Werbeanzeige