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


Anmelden zum Antworten