JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=b925bdbf0695c14676e27c6608435329Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Problem beim Löschen in einer List

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jakozk
Junior JLI'ler



Anmeldedatum: 16.05.2004
Beiträge: 88
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 06.02.2007, 19:53    Titel: Problem beim Löschen in einer List Antworten mit Zitat

Hallo Leute ich habe z.Z Probleme Elemente in einer Liste zu löschen.
CPP:
std::list<Film> FilmList;
std::list<Film>::iterator It;
// --------
class Film
{
public:
   string Titel;
       .....
};



CPP:
std::list<Film>::iterator It;
for(It=FilmList.begin(); It!=FilmList.end(); ++It)
{
         Film EinFilm=*It;
   if(EinFilm.Titel==eingabe)
   {
    It = FilmList.erase(It);
    cout << "gelöscht!" << endl;
   }
}


Ich hoffe ihr versteht was ich mit dem Code bewirken möchte. Wenn ich dies nun ausführe stürzt mein Programm ab und löscht den Eintrag nicht. Ich hoffe ihr könnt den Fehler finden.

PS: Ich habe den Eintrag von Jonathan schon gelesen doch dies konnte mir auch net helfen *g*
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 06.02.2007, 20:26    Titel: Re: Problem beim Löschen in einer List Antworten mit Zitat

Probier es mal so:
CPP:
std::list<Film>::iterator It;
for(It=FilmList.begin(); It!=FilmList.end();)
{
         Film EinFilm=*It;
   if(EinFilm.Titel==eingabe)
   {
    It = FilmList.erase(It);
    cout << "gelöscht!" << endl;
   }
   else
   {
   ++it;
   }
}

_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jakozk
Junior JLI'ler



Anmeldedatum: 16.05.2004
Beiträge: 88
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 06.02.2007, 21:02    Titel: Antworten mit Zitat

Wow danke es funktioniert! Doch was ich nicht verstehe , wieso funktioniert es ? ^^ Im Grunde machen doch beie Funtkionen das gleiche oder täusche ich mich da ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 07.02.2007, 00:01    Titel: Antworten mit Zitat

Jakozk hat Folgendes geschrieben:
Wow danke es funktioniert! Doch was ich nicht verstehe , wieso funktioniert es ? ^^ Im Grunde machen doch beie Funtkionen das gleiche oder täusche ich mich da ?

Nein, tun sie nicht Wink

Der Iterator darf nur um eins weitergesetzt werden, falls das aktuelle Element nicht gelöscht wurde. erase() Übernimmt für dich schon diesen Schritt, indem es den Iterator auf das Element nach dem gelöschten setzt und zurückgibt.
Bei deiner ersten Version überspringst du so entweder Elemente, da die for-Schleife den Iterator zusätzlich weitersetzt oder aber es kommt zu dem besagten Fehler.
Löschst du nämlich das letzte Element, so folgt auf dieses kein weiteres Element. D.h. erase() gibt std::list::end() zurück. Da dies kein gültiges Element mehr ist, darf der Iterator hier in keinem Fall erweitert werden, was aber durch die for-Schleife trotzdem getan wird (du bist hier schon am Ende der Liste -> deshalb Fehler).
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jakozk
Junior JLI'ler



Anmeldedatum: 16.05.2004
Beiträge: 88
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 07.02.2007, 01:26    Titel: Antworten mit Zitat

Ah supper jetzt hab ichs verstanden . Danke für die Hilfe!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 07.02.2007, 07:05    Titel: Antworten mit Zitat

Machs doch einfach über std::remove_if und einen Funktor:

Beispiel:
CPP:
class Film
{
private:
   std::string name_;

public:
   explicit Film( const std::string& name )
      : name_( name )
   {}

   const std::string& GetName() const
   {
      return name_;
   }

   friend std::ostream& operator<<( std::ostream& out, const Film& film )
   {
      return ( out << film.GetName() );
   }
};

struct Remover
   : public std::binary_function< Film, std::string, bool >
{
   bool operator()( const Film& film, const std::string& name ) const
   {
      return film.GetName() == name;
   }
};

int main( int argc, char* argv[] )
{
   typedef std::vector< Film > ListType;

   ListType list;

   // Liste fuellen
   //
   list.push_back( Film( "DWK4 - Die Wilden Kerle" ) );
   list.push_back( Film( "Rocky Balboa" ) );
   list.push_back( Film( "Saw 3" ) );
   list.push_back( Film( "Dreamgirls" ) );
   list.push_back( Film( "Schraeger als Fiktion" ) );
   list.push_back( Film( "Das Streben nach Glueck" ) );
   list.push_back( Film( "Das wilde Leben" ) );
   list.push_back( Film( "Nachts im Museum" ) );
   list.push_back( Film( "Rache ist sexy" ) );

   // Ausgeben   
   //
   std::copy( list.begin(), list.end(), std::ostream_iterator< Film >( std::cout, "\n" ) );
   std::cout << std::endl;

   // Loeschen eines Eintrags
   //
   ListType::iterator it = std::remove_if( list.begin(), list.end(),
                                 std::bind2nd( Remover(), "Schraeger als Fiktion" ) );
   list.erase( it, list.end() );

   // Nochmals ausgeben
   //
   std::copy( list.begin(), list.end(), std::ostream_iterator< Film >( std::cout, "\n" ) );
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum