Löschen von Elementen aus mehreren Vectoren



  • Hallo zusammen,

    ich tüftle nun schon eine ganze Weile mit einem std::vector-Problem herum und würde mich sehr freuen, wenn mir jemand von euch weiterhelfen kann!

    Und zwar ergeben mehrere Vectoren zusammen einen Primärschlüssel, von denen ich doppelte Einträge basierend auf einer Versionsnummer eines 4 Vectors (vectorD) entfernen möchte. Ich habe dafür ein kleines Beispielprogramm geschrieben.
    Wichtig hierbei ist, dass

    Könnt ihr mir sagen, wie ich die doppelten Einträge entfernen kann?
    Egal auf welche Art ich es versuche, ich bekomme immer einen Programmabbruch 😞

    Vielen Dank schon mal vorab!

    #include <cstdlib>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    /*
     * 
     */
    int main(int argc, char** argv) {
    
        cout << "Delete Vector Elements" << endl;
    
        //PrimaryKeys
        vector<int> vectorA;
        vector<int> vectorB;
        vector<int> vectorC;
        //Version
        vector<int> vectorD;
    
        int j = 0;
    
        for (int i = 0; i < 5; i++) {
            vectorA.push_back(i);
            vectorB.push_back(i);
            vectorC.push_back(i);
            vectorD.push_back(j);
        }
        j++;
    
        for (int i = 0; i < 5; i++) {
            vectorA.push_back(i);
            vectorB.push_back(i);
            vectorC.push_back(i);
            vectorD.push_back(j);
        }
    
        cout << "vectorD;vectorA;vectorB;vectorC"<<endl;
          for (int i = 0; i < vectorD.size(); i++) {
          cout << vectorD[i] << ";" << vectorA[i] << ";" << vectorB[i] << ";" << vectorC[i]<<endl;
          }
    
        cout << "Delete elements:"<<endl;
        for (int i = 0; i < vectorD.size(); i++) {
            for (int l = 0; l < vectorD.size(); l++) {
                if (vectorA[i] == vectorA[l]
                        && vectorB[i] == vectorB[l]
                        && vectorC[i] == vectorC[l]) {
                    if (vectorD[i] <= vectorD[j]) {
                        cout << vectorD[i] << ";" << vectorA[i] << ";" << vectorB[i] << ";" << vectorC[i] << " - How to delete this element???" << endl;
    
                       // vectorA.erase(vectorD.begin()+i);
                       // vectorB.erase(vectorD.begin()+i);
                       // vectorC.erase(vectorD.begin()+i);
                       // vectorD.erase(vectorD.begin()+i); D kann auch vollständig bleiben
    
                    } else {
                        cout << vectorD[i] << ";" << vectorA[i] << ";" << vectorB[i] << ";" << vectorC[i] << " - Keep this element!!!" << endl;
                    }
                }
            }
        }
    
        return 0;
    }
    

    Das ergibt folgenden Output:

    Delete Vector Elements
    vectorD;vectorA;vectorB;vectorC
    0;0;0;0
    0;1;1;1
    0;2;2;2
    0;3;3;3
    0;4;4;4
    1;0;0;0
    1;1;1;1
    1;2;2;2
    1;3;3;3
    1;4;4;4
    Delete elements:
    0;0;0;0 - How to delete this element???
    0;0;0;0 - How to delete this element???
    0;1;1;1 - How to delete this element???
    0;1;1;1 - How to delete this element???
    0;2;2;2 - How to delete this element???
    0;2;2;2 - How to delete this element???
    0;3;3;3 - How to delete this element???
    0;3;3;3 - How to delete this element???
    0;4;4;4 - How to delete this element???
    0;4;4;4 - How to delete this element???
    1;0;0;0 - Keep this element!!!
    1;0;0;0 - Keep this element!!!
    1;1;1;1 - Keep this element!!!
    1;1;1;1 - Keep this element!!!
    1;2;2;2 - Keep this element!!!
    1;2;2;2 - Keep this element!!!
    1;3;3;3 - Keep this element!!!
    1;3;3;3 - Keep this element!!!
    1;4;4;4 - Keep this element!!!
    1;4;4;4 - Keep this element!!!



  • Wichtig hierbei ist, dass
    ... die Reihenfolge der Vectoren gleich bleibt, da sich sonst ein anderer Schluessel ergibt



  • Du könntest dir mal die STL-Algorithmen std::remove() und std::remove_if() auf www.cplusplus.com anschauen. Die haben nämlich lineare Laufzeit, während ein erase() in einer Iterationsschleife zu quadratischer Laufzeit führt.



  • Hallo, Danke für die schnelle Antwort, aber
    die beiden stl-Algorithmen helfen mir in diesem Fall ich nicht wirklich weiter.
    std::remove löscht Elemente mit einem bestimmten Wert und std::remove_if (http://www.cplusplus.com/reference/algorithm/remove_if/) bekommt eine Funktion übergeben, die einen Wert als Parameter entgegen nimmt und dann abhängig vom Rückgabewert, dieses Element löscht.
    Ich muss aber Elemente basierend auf verschiedenen Werten aus anderen Vectoren löschen.
    Hat sonst noch jemand eine Idee?


  • Mod

    Immer noch remove_if. Schreib dir einen Funktor der die anderen Vektoren kennt und deine Bedingung als operator() implementiert.



  • Hallo SeppJ,
    was meinst du mit Funktor?



  • Varox_83 schrieb:

    Hallo SeppJ,
    was meinst du mit Funktor?

    klickst du hier...


Anmelden zum Antworten