list::erase()



  • Hallo Leute...

    Mal wieder eine kleine Frage zu obigem Befehl:
    Möchte aus Liste heraus ein Element löschen, nachdem ich es nach diversen Parametern durchsucht habe. Ungefähr so:

    list <signalmuster>::const_iterator iter_smList;
    
    for (iter_smList=tds.smList.begin(); iter_smList!=tds.smList.end(); iter_smList++)
    {
       tds.sm=*iter_smList;
       if (tds.sm.kw1==1)
       {
          tds.sm.erase(iter_smList);
       }
    }
    

    Die Struktur signalmuster sieht so aus:

    struct signalmuster
    {
    	float kw1, kw2, kw3, kw4, kw5, kw6, kw7, kw8, kw9,	// Beträge der Kennwerte
    		  zgDBsoll, zgNOTDBsoll;	// Beträge der Zugehörigkeiten
    	string messung;						// welcher Messung entsprungen?
    	int spule;						// auf welchem Kanal?
    	long position;						// an welcher Position?
    
    	signalmuster () {};
    
    	signalmuster(const signalmuster &sm)	// Kopierkonstruktor
    	{
    		kw1=sm.kw1;
    		kw2=sm.kw2;
    		kw3=sm.kw3;
    		kw4=sm.kw4;
    		kw5=sm.kw5;
    		kw6=sm.kw6;
    		kw7=sm.kw7;
    		kw8=sm.kw8;
    		kw9=sm.kw9;
    		zgDBsoll=sm.zgDBsoll;
    		zgNOTDBsoll=sm.zgNOTDBsoll;
    		messung=sm.messung;
    		spule=sm.spule;
    		position=sm.position;
    	}
    
    	operator=(const signalmuster &sm)	// Zuweisungsoperator
    	{
    		this->kw1=sm.kw1;             // HIER!!!
    		this->kw2=sm.kw2;
    		this->kw3=sm.kw3;
    		this->kw4=sm.kw4;
    		this->kw5=sm.kw5;
    		this->kw6=sm.kw6;
    		this->kw7=sm.kw7;
    		this->kw8=sm.kw8;
    		this->kw9=sm.kw9;
    		this->zgDBsoll=sm.zgDBsoll;
    		this->zgNOTDBsoll=sm.zgNOTDBsoll;
    		this->messung=sm.messung;
    		this->spule=sm.spule;
    		this->position=sm.position;
    	}
    };
    

    Zur Laufzeit bekomme ich an der oben mit "HIER!!!" markierten Position eine Access Violation?! Was kann das sein?!

    Vielen herzlichen Dank und liebe Grüße,
    Holger



  • Deine struct braucht weder einen Kopierkonstruktor noch einen Zuweisungsoperator. Bezüglich erase solltest du beachten, dass der iterator durch erase ungültig wird, d.h. das ++ danach geht wohl schief.



  • So etwas hatte ich schon vermutet, aber sicher war ich mir da nicht...

    Wie kann ich es denn dann erreichen, dass ich eine Liste nur einmal durchlaufe und nicht mehrmals, nachdem der iterator ungültig wurde und ich von neuem beginne...

    Vielen Dank bis hierhin...

    Gruß,
    Holger



  • Dieser Thread wurde von Moderator/in dEUs aus dem Forum MFC mit dem Visual C++ in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • edward schrieb:

    So etwas hatte ich schon vermutet, aber sicher war ich mir da nicht...

    Wie kann ich es denn dann erreichen, dass ich eine Liste nur einmal durchlaufe und nicht mehrmals, nachdem der iterator ungültig wurde und ich von neuem beginne...

    Vielen Dank bis hierhin...

    Gruß,
    Holger

    Du musst nicht von neuem beginnen. list<T>::erase liefert dir den naechsten
    gueltigen Iterator zurueck.

    mfg
    v R



  • virtuell Realisticer schrieb:

    Du musst nicht von neuem beginnen. list<T>::erase liefert dir den naechsten
    gueltigen Iterator zurueck.

    Sprich du musst in deiner Schleife jetzt nur noch von dieser Tatsache gebrauch machen:

    for (iter_smList=tds.smList.begin(); iter_smList!=tds.smList.end(); /* kein
    Inkrement hier */)
    {
       tds.sm=*iter_smList;
       if (tds.sm.kw1==1)
       { 
          iter_smList = tds.sm.erase(iter_smList);
       }
       else { 
          ++iter_smList;
       }
    }
    


  • hi!

    kann man sowas auch für einen vector::iterator machen, damit er mein erase nicht ungültig wird?

    cu


Anmelden zum Antworten