Entfernen nicht benachbarter Duplikate
-
Guten Tag!
Es geht um folgende Aufgabe: (Stroustrup, §5.9-Ü11)
Lesen Sie ein Folge von Wörtern aus der Eingabe. Benutzen Sie "Quit" als das Wort,
das die Eingabe beendet. Geben Sie die Wörter in der Reihenfolge aus, in der sie
eingegeben wurden. Geben Sie kein Wort mehrmals aus.Ich bin zwar auf eine Lösung gekommen, habe aber das Gefühl, dass diese sehr
uneffizient ist und es sicher eine bessere Möglichkeit gibt:#include <iostream> #include <string> #include <vector> #include <algorithm> #include <iterator> using namespace std; int main() { string buffer; vector<string> words; // Woerter einlesen while (buffer != "Quit") { cin >> buffer; words.push_back(buffer); } // Letztes Wort entfernen (muss 'Quit' sein) words.pop_back(); // Neue Wortliste erzeugen, die keine Duplikate enthaelt vector<string> new_words; typedef vector<string>::const_iterator VI; for (VI p = words.begin(); p != words.end(); ++p) // Wort nur der Liste hinzufuegen, wenn es noch nicht vorhanden ist if (find(new_words.begin(), new_words.end(), *p) == new_words.end()) new_words.push_back(*p); // Neue Wortliste ausgeben for (int i=0; i<new_words.size(); ++i) cout << new_words[i] << '\n'; }
Ich habe mich zunächst gewundert, warum es mit unique_copy() nicht funktioniert,
bis ich herausgefunden habe, dass dies nur für benachbarte Duplikate geht.Meine Frage nun: Wie würdet ihr das Problem lösen?
Es ist ja auch etwas unelegant gleich eine neue Liste zu erzeugen, es ist doch
sicher möglich, gleich alle Duplikate aus dem einzigen std::vector zu entfernen.gruß,
walker
-
Wirklich keiner eine Idee?
Meine Methode ist ja bei einem sehr großen std::vector sicherlich verdammt langsam.gruß,
walker
-
walker schrieb:
Wirklich keiner eine Idee?
Meine Methode ist ja bei einem sehr großen std::vector sicherlich verdammt langsam.gruß,
walkerUnd man darf keine map nutzen? Oder ein sort mit eigenem Prädikat?
-
für alle worter in vector, i ist laufvariable solange du ein anderes element findest das gleich i ist löchsche es
-
Gute Idee, vielen Dank dafür
gruß,
walker
-
dann aber mit std::list
oder man swapt das doppelte wort nach hinten weil beim löschen im vector ein neuer vector angelegz wird.
-
.b7f7 schrieb:
dann aber mit std::list
oder man swapt das doppelte wort nach hinten weil beim löschen im vector ein neuer vector angelegz wird.aber dan werden die worte nicht mehr in der reinfolge angezeigt in der sie eingegeben wurden