std::vector gleiche einträge entfernen
-
hallo,
wie kann man am besten aus einem vector(unsortiert) einen neuen vector erstellen, der alle einträge nur einmal enhält ?
struct Test { int a; int b; int c; };
std::vector<struct Test> vector_full; std::vector<struct Test> vector_neu; // hier soll vector_neu mit daten gefüllt werden
Ergebnis soll so sein(z.B): vector_full: (1,2,3) (2,3,4) (5,4,1) (1,2,3) (5,4,1) // (1,2,3) und (5,4,1) kommen mehrmals vor vector_neu: (1,2,3) (2,3,4) (5,4,1)
-
Du könntest z.B. für Test den Operator '==' definieren und dann mittels unique_copy() (aus <algorithm>) den Inhalt von vector_full in vector_new kopieren.
struct Test { int a; int b; int c; bool operator==(const Test &t) { return ((a == t.a) && (b == t.b) && (c == t.c)); } }; [...] std::vector<struct Test> vector_full; std::vector<struct Test> vector_neu; [...] insert_iterator<vector<Test> > ins(vector_neu, vector_neu.begin()); unique_copy(vector_full.begin(), vector_full.end(), ins); //Es wird so kopiert, dass alle Objekte in vector_new nur einmal vorkommen
-
unique_copy übergeht nur aufeinanderfolgende Duplikate. Dazu müsste man vector_full also vorher sortieren.
-
WeiseCoder schrieb:
wie kann man am besten aus einem vector(unsortiert) einen neuen vector erstellen, der alle einträge nur einmal enhält ?
Da gibt es viele Möglichkeiten. Welche die Richtige ist, hängt entscheidend von deinem konkreten Problem ab (Wie groß ist dein Vektor?, Wie oft wird die Operation aufgerufen?, Muss die Reihenfolge der Elemente stabil bleiben?...)
Wenn du aber z.B. nur relativ kleine Vektoren bearbeitest und diese Operation nur selten durchgeführt werden muss, dann reicht wahrscheinlich eine ganz naive Implementation:
for(vector<Test>::const_iterator it = vector_full.begin(); it != vector_full.end(); ++it) { if (find(vector_neu.begin(), vector_neu.end(), *it) == vector_neu.end()) { vector_neu.push_back(*it); } }
-
HumeSikkins schrieb:
Da gibt es viele Möglichkeiten. Welche die Richtige ist, hängt entscheidend von deinem konkreten Problem ab (Wie groß ist dein Vektor?, Wie oft wird die Operation aufgerufen?, Muss die Reihenfolge der Elemente stabil bleiben?...)
- Vector grösse ist ungefähr 1.000 - 10.000 einheiten
- die Reihenfolge der Elemente soll nach Möglichkeit stabil bleiben
- diese Operation wird nur einmal aufgerufen, und Zeit spielt da unbedeutende Rollewelche Möglichkeit wäre dann am besten ?
gruess
-
ich würd ein Compare für ein Set machen, dann alle Werte in den Set rein, danach die Werte im Set in einen Vektor kopieren
also so zB:struct CompareTest { bool operator()(const Test& left, const Test& right) const { return left == right; } }; std::set<Test, CompareTest> myset;
-
Von hinten durch die Brust ins Auge?
Da glänzt Humes Lösung doch mit Direktheit. (Obwohl ich lieber mit Indizes über Vektoren iteriere.)