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, dassKö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()undstd::remove_if()auf www.cplusplus.com anschauen. Die haben nämlich lineare Laufzeit, während einerase()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?
-
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?
-