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ß,
    walker

    Und 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


Anmelden zum Antworten