Listen Einträge in Schleife löschen, Runtime Error, cannot increment end list iterator



  • Hallo,
    habe das Problem, dass sich die Einträge von Instanzen einer Struktur innerhalb einer Liste nicht löschen lassen, ohne einen RunTime Error zu bekommen."Cannot increment end list iterator"

    void UpdateTrades(float value, ACCOUNT ACC)
    {
    	
    	//Trades nach SL und TP prüfen und ggf schließen & Listeneintrag löschen
    		list<TRADES>::iterator i;
    
    
    		for (i = lOpenTrades.begin(); i != lOpenTrades.end(); i++)
    		{
    			float SL = i->SL;
    			float TP = i->TP;
    
    
    			if (i->BUY != 0 && lOpenTrades.size() > 0)
    			{
    				if (value >= TP || value < SL )
    				{
    	
    					//TAKE-PROFIT aktivierung
    					//_______________________________________________________________________					
    
    						//Trade in Liste CLOSETRADES hinzufügen und G/V implementieren
    						i->CLOSE = value;
    						i->Result = ((i->TradeSize / i->OPEN) * value);
    
    						lClosedTrades.push_back(*i);
    
    
    						//Eintrag in Liste OpenTrades Löschen
    						i = lOpenTrades.erase(i);
    					
    					//_______________________________________________________________________
    				
    
    				}
    
    			}
    		
    		}
    
    
    }
    

    Die Liste ist Global, auf sie wird ansonsten nur durch auslesen oder pushback zugegriffen. Alle Zugriffe werden im if(lOpenTrades.empty() == false) ausgeführt.

    Diese Fehlermeldung taucht nur auf, wenn die Liste zu wenig eintrage hat, habe schon versucht Einträge mit dem Wert NULL einzufügen, die dann im weiteren verlauf ignoriert werden, um diesen Fehler zu beheben, jedoch funktionierte dies auch nicht. Bin ehrlich gesagt schon eine Stunde am rumprobieren und googlen.

    Gehe davon aus das es etwas offensichtliches ist, pls help.



  • Return value

    Iterator following the last removed element. If the iterator pos refers to the last element, the end() iterator is returned.

    https://en.cppreference.com/w/cpp/container/list/erase

    Dann ist i++ blöd.



  • @manni66 Vielen vielen Dank. Ich wusste, dass es sowas banales ist.

    Fixed:

    void UpdateTrades(float value, ACCOUNT ACC)
    {
    
    	//Trades nach SL und TP prüfen und ggf schließen & Listeneintrag löschen
    	list<TRADES>::iterator i;
    
    	if (lOpenTrades.empty() == false)
    	{
    
    		for (i = lOpenTrades.begin(); i != lOpenTrades.end(); )
    		{
    	
    			if (value >= i->TP || value < i->SL)
    			{
    
    
    				//TAKE-PROFIT aktivierung
    				//_______________________________________________________________________					
    
    				//Trade in Liste CLOSETRADES hinzufügen und G/V implementieren
    
    				i->CLOSE = value;
    				i->Result = ((i->TradeSize / i->OPEN) * value);
    
    				lClosedTrades.push_back(*i);
    
    
    				//Eintrag in Liste OpenTrades Löschen
    
    				i = lOpenTrades.erase(i);
    
    				//_______________________________________________________________________
    
    			}
    			else
    			{
    				++i;
    			}
    
    		}
    		
    
    	}
    
    
    }
    

    Der iterator wird durch i = lListe.erase(i); bereits um 1 erhöht, durch das i++; in der Schleifen wird i somit zwei mal erhöht, was dann wohl die Probleme verursacht. Lösung - entweder löschen oder i++;
    Falls ich das jetzt richtig verstanden habe, jedenfalls funktioniert es.

    Danke!



  • Oder ohne Schleife:

    lOpenTrades.remove_if( [value]( auto& trade ) {
                   if (value >= trade.TP || value < trade.SL) {
    				trade.CLOSE = value;
    				trade.Result = ((trade.TradeSize / i->OPEN) * value);
    
    				lClosedTrades.push_back(trade);
                                    return true;
    		}
                    return false;
    });
    

Anmelden zum Antworten