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

11

11.03.2010, 19:16

Zitat von »"the[V«

oid"]

C-/C++-Quelltext

1
2
3
4
5
Unit* aUnits = new Unit[ 2 ];
aUnits[ 0 ] = new Soldier();
aUnits[ 1 ] = new Tank();
// ...

delete [] aUnits;
Da müsste Unit** aUnits und new Unit*[2] stehen. Mit STL-Containern hat man allerdings dasselbe Problem. Die Speicherverwaltung von polymorphen Zeiger kann ein STL-Container nicht übernehmen. Gut geeignet wären für solche Fälle Boosts Pointer-Container (Smart-Pointer sind es im Allgemeinen nicht).

Zitat von »"the[V«

oid"]Wie kommst du jetzt bei std::map auf Baum, Nox?
Vermutlich wird es in den meisten Fällen als Baum implementiert sein (zwecks Sortierung), aber nach Außen hin ist ein Dictionary.
Welche Datenstrukturen kommen denn ausser einem Baum noch in Frage? Du musst bedenken, dass der Standard gewisse Anforderungen an die Zeitkomplexität verschiedener Operationen stellt. Sortiert muss der Container ohnehin sein.

Dictionary, assoziatives Array, Schlüssel-Wert-Zuordnungstabelle oder Map sind semantische Begriffe, die nicht an eine feste Implementierung gebunden sind. Man könnte ein assoziatives Array genauso unter Verwendung von std::vector implementieren, das kann sogar sinnvoll sein.

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

12

11.03.2010, 19:30

Zitat von »"Nexus"«

Zitat von »"the[V«

oid"]

C-/C++-Quelltext

1
2
3
4
5
Unit* aUnits = new Unit[ 2 ];
aUnits[ 0 ] = new Soldier();
aUnits[ 1 ] = new Tank();
// ...

delete [] aUnits;
Da müsste Unit** aUnits und new Unit*[2] stehen. Mit STL-Containern hat man allerdings dasselbe Problem. Die Speicherverwaltung von polymorphen Zeiger kann ein STL-Container nicht übernehmen. Gut geeignet wären für solche Fälle Boosts Pointer-Container (Smart-Pointer sind es im Allgemeinen nicht).

Ja da muss natürlich ein Doppelpointer hin. Was genau meinst du mit einer Speicherverwaltung von polymorhen Zeigern? Selbstverständlich kannst du Zeiger auf polymorphe Objekte mit einem STL-Container verwalten O.o Mache ich tagtäglich, warum sollte das nicht gehen?

Zitat von »"Nexus"«

Dictionary, assoziatives Array, Schlüssel-Wert-Zuordnungstabelle oder Map sind semantische Begriffe, die nicht an eine feste Implementierung gebunden sind. Man könnte ein assoziatives Array genauso unter Verwendung von std::vector implementieren, das kann sogar sinnvoll sein.


Genau das habe ich doch gesagt O.o
<< an dieser Stelle ist eine Signatur verstorben >>

13

11.03.2010, 20:19

Zitat von »"the[V«

oid"]Ja da muss natürlich ein Doppelpointer hin. Was genau meinst du mit einer Speicherverwaltung von polymorhen Zeigern? Selbstverständlich kannst du Zeiger auf polymorphe Objekte mit einem STL-Container verwalten O.o Mache ich tagtäglich, warum sollte das nicht gehen?
Ich sagte, der Container könne dir die entsprechende Speicherverwaltung nicht abnehmen. Sofern du also normale Zeiger speicherst, bist du gezwungen, alle Objekte selbst freizugeben, und nimmst einige weitere Nachteile in Kauf. Manuelle Speicherverwaltung sollte jedoch auf ein Minimum reduziert werden, wenn robuster und wartbarer Code angestrebt wird (das heisst nicht, dass man nie besitzende Zeiger in STL-Containern speichern sollte, aber in den meisten Fällen gibts eben bessere Lösungen).

Zitat von »"the[V«

oid"]Genau das habe ich doch gesagt O.o
Nun ja, Nox hat die Datenstrukturen aufgezählt und du hast eingewendet, dass Dictionary zu std::map besser passe als Baum, was in dem Kontext eben nicht der Fall ist.

idontknow

unregistriert

14

11.03.2010, 22:28

Zitat von »"NachoMan"«

seit wann ist std::vector eine verkettete liste?


Ich weiß ehrlich gesagt nich was vector ist, ob aray liste oder what else is mir egal. Ich weiß was es macht und wie ich es benutze :)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

15

11.03.2010, 23:11

Zitat von »"idontknow"«

Zitat von »"NachoMan"«

seit wann ist std::vector eine verkettete liste?


Ich weiß ehrlich gesagt nich was vector ist, ob aray liste oder what else is mir egal. Ich weiß was es macht und wie ich es benutze :)


Es gibt aber wesentliche Unterschiede wann man eine liste und wann man ein vector benutzt und die sollte man kennen. Und dazu gehört, dass ein vector eben keine verkette Liste ist.

idontknow

unregistriert

16

12.03.2010, 13:35

Drum benutzeich ja List nicht :P. SOndern meist nur Vector.

ABer ich bin ja noch lernfähig, will mal jmd. von euch sehen der sdchnurstracks alle STL COntainer gelernt hat...

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

17

12.03.2010, 13:48

es ist eigentlich ganz einfach. eine doppelt verkettete liste hat zu jedem objekt noch ein zeiger auf das nächste und einen auf das vorherige element.
geht man die liste mit einem iterator durch benutzt dieser die zeiger um das nächste element zu finden.
std::vector reserviert den speicher auf ein mal. der speicherbereich ist zusammenhängend und man kann zeigerarithmatik verwenden.

vector vorteile: schneller zugriff auf bestimmte elemente. schnelle initialisierung.
nachteile: einfügen oder löschen dauert relativ lang weil immer das gesammte array kopiert werden muss.
list vorteile: schnelles löschen/einfügen neuer elemente an beliebigen stellen.
nachteile: höherer speicherverbrauch und "versteckte" verwaltungsarbeit bei dem umgang mit den zeigern.
"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?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

18

12.03.2010, 16:50

Zitat

std::vector reserviert den speicher auf ein mal. der speicherbereich ist zusammenhängend und man kann zeigerarithmatik verwenden.


Er reserviert einmal genug Speicher und er wächst dann mit einem bestimmten Faktor, wenn er den aktuellen Speicher überschreitet. Denke, dass du das schon richtig verstanden hast, aber nur, dass keine Missverständnisse entstehen.

Werbeanzeige