|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jakozk Junior JLI'ler
Anmeldedatum: 16.05.2004 Beiträge: 88 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 06.02.2007, 19:53 Titel: Problem beim Löschen in einer List |
|
|
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 |
|
|
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 06.02.2007, 20:26 Titel: Re: Problem beim Löschen in einer List |
|
|
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 |
|
|
Jakozk Junior JLI'ler
Anmeldedatum: 16.05.2004 Beiträge: 88 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 06.02.2007, 21:02 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 07.02.2007, 00:01 Titel: |
|
|
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
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 |
|
|
Jakozk Junior JLI'ler
Anmeldedatum: 16.05.2004 Beiträge: 88 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 07.02.2007, 01:26 Titel: |
|
|
Ah supper jetzt hab ichs verstanden . Danke für die Hilfe! |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 07.02.2007, 07:05 Titel: |
|
|
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 |
|
|
|
|
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
|