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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

10.06.2013, 17:30

Mit while oder do-while ist das auch kein Problem. Mit einem for-each/iterator hingegen gibt das Stress.
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]

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

12

10.06.2013, 17:45

Das ist vor allem ein generelles Problem von Containern. Jeder Container hat seine eigenen Charakteristiken, dazu zählt auch das Verhalten bei Löschen eines Elements. Zum std::vector steht z.B. in der Dokumentation, dass bei Löschen eines Elements alle Iteratoren auf dieses Element und alle Iteratoren auf Elemente dahinter ungültig werden. Für std::list oder std::slist gilt: nur Iteratoren auf das gelöschte Element werden ungültig, aber Iteratoren auf Elemente dahinter bleiben gültig.

Ich bin verblüfft, wie weit man bei der Programmierung kommen kann, ohne solch elementaren Sachen draufzuhaben. Das ist wichtig, Leute. Wirklich. Auch die Geschichte mit dem Iterator-Vergleich. KleinerAls, GrößerAls und solche Sachen funktionieren nur, falls die Iteratoren wirklich unmittelbar als Zeiger implementiert sind und falls der Container ein einziger kontinuierlicher Speicherblock ist. Das gilt nach meinem Wissen nur für std::vector und std::stack, der ja von vector abgeleitet ist. Für std::list, std::slist und auch für alle anderen node-basierenden Container klappt das nur durch Zufall, weil der Heap neue Allokationen zumeist mit aufsteigenden Adressen ausgibt. Aber wehe, Dein Programm läuft schon ein bisschen, oder der Heap ist ein bisschen anders implementiert. Solche Fehler sind eine offene Einladung für absurde Crashes und Fehlverhalten, die nur manchmal auftreten und schwer zu debuggen sind.
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.

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

13

10.06.2013, 17:54

std::stack baut meines Wissens nach auf std::deque auf.

C-/C++-Quelltext

1
template < class T, class Container = deque<T> > class stack;

Quelle

Außerdem hat ein Stack keine Iteratoren, man kann nur auf das oberste Element zugreifen.

Der Vergleich mit < und > funktioniert mit allen Random-Access-Iteratoren. std::vector und std::deque sind Container, die solche zur Verfügung stellen.
Bei anderen Containern scheitert das mit einem Compiler-Fehler, da diese Operatoren nicht überladen sind (!Compiler-abhängig!).

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

14

10.06.2013, 17:59

Mit erase geht es wunderbar:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
// cont ist hier irgendein std container (also alle die erase können)
for(auto it = cont.begin(); it != cont.end();)
{
  if(*it == ...)
  {
    // lösche (erase liefert iterator auf das nächste element)
    it = cont.erase(it);
  }else{
    // nicht löschen
    ++it;
  }
}

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

15

10.06.2013, 18:05

std::stack baut meines Wissens nach auf std::deque auf.


Ok, Danke für die Korrektor. Ich glaube, ich hätte unter VC10 mal gesehen, dass std::stack intern als vector implementiert ist. Aber da man ja nicht darüber iterieren kann, wie Du richtig eingewendet hast, ist das eine akademische Diskussion.
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.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

10.06.2013, 18:23

Ich bin verblüfft, wie weit man bei der Programmierung kommen kann, ohne solch elementaren Sachen draufzuhaben. Das ist wichtig, Leute. Wirklich.
Du hast Dich da hoffentlich nicht auf mich bezogen, oder? Du hast immerhin ganz schön verallgemeinert.
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]

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

17

10.06.2013, 18:38

Nein, das war nicht auf Dich bezogen. Du verwendest ja hauptsächlich kein C++, soweit ich weiß. Du musst das also gar nicht wissen. Aber es war in der Tat zu allgemein formuliert. Ich bitte um Entschuldigung.
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.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

18

10.06.2013, 20:53

Kein Problem, wollte nur nochmal sichergehen, dass ich keinen Blödsinn erzählt habe ;) C++ nutze ich ja doch in der Tat vergleichsweise wenig und trotzdem weiß ich zumindest das ;)
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]

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

19

11.06.2013, 09:33

Mit erase geht es wunderbar:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
// cont ist hier irgendein std container (also alle die erase können)
for(auto it = cont.begin(); it != cont.end();)
{
  if(*it == ...)
  {
    // lösche (erase liefert iterator auf das nächste element)
    it = cont.erase(it);
  }else{
    // nicht löschen
    ++it;
  }
}
Und faellt dir was auf: http://www.cplusplus.com/reference/map/map/erase/

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

20

11.06.2013, 09:59

Was TGGC meint: Das freundliche Feature, dass erase() einen Iterator auf das nächste gültige Element liefert, ist nur ab C++11 so spezifiziert. Davor war es nur auf Visual Studio-Kompilern verfügbar.
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.

Werbeanzeige