Bestimmte Spalte in zweidimensionalem Vektor löschen



  • Hallo liebe Programmierer,

    nachdem ich mir nun mehrere tage den Kopf zerbrochen habe, hoffe ich, dass mir einer von euch weiter helfen kann.

    Ich habe einen zweidimensionalen Vektor "Matrix", welcher 3 Reihen und 24 Spalten hat. In der oberen Spalte sind Werte nach diesem Prinzip angeordnet: 0 0 1 1 2 2.. und in den nächsten beiden Spalten befinden sich Werte, die sich auf den jeweiligen Wert in der ersten Spalte beziehen. Nun möchte ich Spalten löschen, die einen bestimmten Wert in der 1. Zeile enthalten, z. B. die Spalten, die den Wert 1 in der 1. Zeile enthalten. Wie mache ich das am besten? Hier ist mein Code, der bisher am besten funktioniert, jedoch nur eine Spalte löscht. Was ist der Fehler? Oder muss ich es ganz anders machen?

    vector<double>::iterator it=matrix[0].begin(), end = matrix[0].end();
    
    	vector<int> Löschen; double pos;
    	double Wert= matrix[0][position]; //position habe ich vorher bestimmt 
    	cout << "Wert" << Wert;
    
    	for (int i=0; i < matrix[0].size(); i++)
    	{
    
    	if (matrix[0][i]==Wert)
    	{
    		int pop = matrix[0][i];
    		it = find(matrix[0].begin(),matrix[0].end(),pop);
    		pos = distance (matrix[0].begin(),it);
    
    				for (unsigned i = 0; i < matrix.size(); ++i)
    				{
    				if (matrix[i].size() > pos)
    					{
    					matrix[i].erase(matrix[i].begin() + pos);
    
    					}
    				}
    				it1=matrix[0].begin();
    		}
    
    	}
    

    Ich hoffe, mir kann jemand helfen, damit ich wieder schlafen kann 😉



  • Ich habe nun nochmal die if-Bedíngung geändert auf

    if (matrix[0][i]==matrix[0][Wert])
    

    Und jetzt geht es. Oder geht ist das falsch gedacht?



  • In der oberen Spalte

    Oberen Spalte? 😕

    Nun möchte ich Spalten löschen, die einen bestimmten Wert in der 1. Zeile enthalten, z. B. die Spalten, die den Wert 1 in der 1. Zeile enthalten. Wie mache ich das am besten?

    Durch gehen und löschen?

    for( auto iter = matrix.begin(); iter != matrix.end() ; ++iter )
        if( (*iter)[0] == 1 )
            iter = matrix.erase( iter );
    

    (Ungetestet!)
    Vorausgesetzt du meinst tatsächlich Spalten.

    Edit: Ach, du willst die Vektoren der zweiten Dimension prüfen. Gut, dann geht das so nicht, da brauchst du tatsächlich eine Schleife die den ersten Index 0 und den zweiten variable setzt.

    for( std::size_t y = 0; y < matrix.size() ; ++y ) 
        if( matrix[0][y] == 1 ) 
        {
            for( std::size_t x = 0; x < matrix[0].size() ; ++x )
                matrix[x].erase( matrix[x].begin() + y );
            --y; // Wichtig!
        }
    

    Oder so in der Richtung, ist ungetestet. Sollte aber gehen.



  • Vielen Dank für deine Antwort.

    Allerdings wird auf diese Weise bei mir immer nur die erste der beiden Spalte mit dem gesuchten Wert gelöscht.

    Ich denke es liegt an der if-Bedingung. ich weiß nicht, wie ich ausdrücke, dass in der Matrix der Wert x (welcher sich auch bei jeder Iteration ändert) an der Position matrix[0][i] stehen muss.
    Scheinbar ist diese Version

    if (matrix[0][i]==matrix[0][Wert])
    

    ja falsch, um zu prüfen, ob z.B. matrix[0][i] den Wert 10 enthält. Irgendwann wird dann nämlich immer eine "Vector out of range exception" angezeigt. Nur wie mache ich es dann???



  • Allerdings wird auf diese Weise bei mir immer nur die erste der beiden Spalte mit dem gesuchten Wert gelöscht.

    War ein kleiner Fehler drin. Geht's jetzt?



  • Nee, leider immer noch nicht so richtig.
    Habe es jetzt so gemacht:

    if (matrix[0][i]==matrix[0][i==Wert])
    

    und so funktioniert es, außer, wenn an der Wert 0 ist, wird dieser immer nur einmal gelöscht und ich verstehe nicht, wieso. Kann mir da jemand weiter helfen?

    Der ganze Code

    double Wert= matrix[0][position];
    	cout << "Job" << Wert;
    
    	for (int i=0; i < matrix[0].size(); ++i)
    	{
    
    	if (matrix[0][i]==matrix[0][i==Wert])
    	{
    
    		it1 = find(matrix[0].begin(),matrix[0].end(),Wert);
    		pos = distance (matrix[0].begin(),it1);
    
    				for (unsigned i = 0; i < matrix.size(); i++)
    				{
    				if (matrix[i].size() > pos)
    					{
    					matrix[i].erase(matrix[i].begin() + pos);
    
    					}
    				}
    				it1=matrix[0].begin();
    		}
    
    	}
    


  • Sorry, ich habe die Änderung in deinem vorherigen Beitrag zuerst übersehen.

    Jetzt funktioniert es! Vielen vielen Dank für deine Hilfe!!!! Du hast mir unglaublich weiter geholfen! 🙂


Anmelden zum Antworten