Element aus std::list enfernen
-
hallo ich habe eine liste von Studentenobjekten und möchte nun
ein beliebigen Studenten löschen :#include<iostream> using std::ostream; using std::cout; class Student { friend ostream& operator<< (ostream&, const Student&); public: Student(const int& ,const string&, const string&); virtual ~Student(void); bool operator<(const Student&)const; //bool operator==(const Student&)const; void setNoten(const int& pg, const int&tk, const int&ma); void durchschnitt(); double getDurchschnitt()const; string getName()const; private: int matrikelnummer; string name; string vorname; double tK; double pG; double mA; double ds; double med; };________________________________________________-
..
.. #include <list> typedef std::list<Student> Studentlist; void removeStud(Studentlist& ); int _tmain(int argc, _TCHAR* argv[]) { Studentlist studentenliste; PGnoten pgvector; ifstream inFile; ofstream outFile; loadList(ifstream& inFile, Studentlist& studentenliste); std::ostream_iterator<Student>output(cout, " "); std::copy(studentenliste.begin(), studentenliste.end(), output);// wird schön alles angezeigt removeStud(Studentlist&); //hier fehler//ab hier das problem.... .. } //problem funktion!!) void removeStud(Studentlist& studentenliste) { string name; cout<<"Welchen Student moechten sie enfernen?:"; cin>>name; std::list<Student>::iterator iter; for(iter=studentenliste.begin(); iter!=studentenliste.end(); ++iter) { if((*iter).getName()==name) {studentenliste.erase(iter); /hier runtimefehler!! //--iter; //hab ich auch schon probiert geht aber nich } } }hab ich irgendein denkfehler ich dacht das geht so?
-
erase invalidiert den iterator. der runtimefehler tritt auf bei
i++, weil i kein gültiger iterator mehr ist. erase gibt allerdings einen iterator auf das nächste element zurück.i = --liste.erase(i)wäre eine lösung;oder du verwendest list::remove bzw. list::remove_if.
-
hatte jetzt:
void removeStud(Studentlist& studentenliste) { string name; cout<<"Welchen Student moechten sie enfernen?:"; cin>>name; std::list<Student>::iterator iter; for(iter=studentenliste.begin(); iter!=studentenliste.end(); ++iter) { if((*iter).getName()==name) { studentenliste.remove(*iter); //--iter auch schon probiert , was muss ich machen ???? } } }gibt auch runtime fehler !
hatte dann wieder
bool Student::operator==(const Student &s)const
{
return(s.name==name);
}
reingemacht aber trotzdem gehts nicht
-
for(iter=studentenliste.begin(); iter!=studentenliste.end();) { if((*iter).getName()==name) { studentenliste.erase(iter++); } else { iter++; } }
-
danke