if anweisung eingabe mit vector vergleichen
-
Hallo.
Lerne gerade c++... Im Moment ist es die Aufgabe Wörter, die von einem nicht gemocht werden durch "xxx" zu ersetzen.#include<iostream> #include<string> #include<vector> #include<algorithm> #include<cmath> using namespace std; void wait () { // Löscht etwaige Fehlerzustände die das Einlesen verhindern könnten cin.clear(); // Ignoriert soviele Zeichen im Puffer wie im Puffer vorhanden sind // (= ignoriert alle Zeichen die derzeit im Puffer sind) cin.ignore(cin.rdbuf()->in_avail()); // Füge alle eingelesenen Zeichen in den Puffer bis ein Enter gedrückt wird // cin.get() liefert dann das erste Zeichen aus dem Puffer zurück, welches wir aber ignorieren (interessiert uns ja nicht) cin.get(); } int main(){ /* vector<string>dislikewords(2); //Vector für Wörter die unbeliebt sind dislikewords[0]="arsch"; dislikewords[1]="man"; */ string ersetzen="xxx"; cout << "Geben Sie ihren Text ein\n"; vector<string> words; string woerter; string dislikewords ="arschbla"; while (cin>>woerter){ if(woerter==dislikewords) words.push_back(ersetzen); else words.push_back(woerter); } for( int i=0;i<words.size();++i) if (i==0 || words[i-1]!=words[i]) cout << words[i] << "\n"; wait(); // Warten auf Enter return 0; }Das Programm funktioniert auch mit einem Wort(string dislikewords ="arschbla";)
Jedoch soll es mit mehreren funktionieren.
Deshalb habe ich am anfang einen Vector erstellt(ist jetzt ausgekommentioert). Vergleiche ich nun die Eingabe mit den Vector if(woerter==dislikewords) kommt die Fehlermeldung:
Fehler 1 error C2784: "bool std::operator ==(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)": template-Argument für "const std::vector<_Ty,_Alloc> &" konnte nicht von "std::string" hergeleitet werden. c:\c+++\main.cpp 676Benutze Vb 2008 express
Buch: Einführung in die Programmiersprache C++ von Bjarne Stroustrup(keine Lösungen)Ich hoffe ihr könnt mir sagen was ich falsch gemacht habe.
Danke schonmal

-
Wie soll denn der Vergleich von einem Wort mit mehreren Wörtern aussehen? Das gibt es nicht. Du musst das Wort mit jedem einzelnen Wort aus deinem Container vergleichen.
(P.S.: Wenn du feststellen willst, ob ein Objekt in einer Liste gewisser anderer Objekte enthalten ist, dann ist ein set eine deutlich bessere Datenstruktur als ein vector, da es eine sehr schnelle Funktion hat die dies feststellt.)
-
Wenn die "dislikewords" Wörter nur einmal initialisiert werden (oder nur selten verändert), kann man sie auch gut in einem sortierten vector speichern und mit
std::binary_searchfinden.int main() { using namespace std; vector<string> dislikewords(2); //Vector für Wörter die unbeliebt sind dislikewords[0]="arsch"; dislikewords[1]="man"; sort(dislikewords.begin(), dislikewords.end()); string ersetzen="xxx"; cout << "Geben Sie ihren Text ein\n"; vector<string> words; string woerter; while (cin>>woerter) if (binary_search(dislikewords.begin(), dislikewords.end(), woerter)) words.push_back(ersetzen); else words.push_back(woerter); return 0; }
-
Vielen Dank euch beiden.
Das set werde ich mir mal anschauen, wenn es im Buch nicht vorkommt :-).
Ich denke man soll mehrere if anweisungen nehmen.
Also:if(woerter==dislikewords[1]) words.push_back(ersetzen); else if((woerter==dislikewords[2]) words.push_back(ersetzen);Die Lösung von brotbernd klappt auch. Danke

-
Piane schrieb:
Vielen Dank euch beiden.
Das set werde ich mir mal anschauen, wenn es im Buch nicht vorkommt :-).
Grober Fehler im Buch. Sehr grob. Buch taugt nichts.
Ich denke man soll mehrere if anweisungen nehmen.
Also:if(woerter==dislikewords[1]) words.push_back(ersetzen); else if((woerter==dislikewords[2]) words.push_back(ersetzen);Die Lösung von brotbernd klappt auch. Danke

Das ist nicht dein Ernst, oder? Wie áare es mit einer Schleife?
-
Hab mal nachgeschaut, die Assoziative container kommen in Kapitel 21 und ich bin in Kapitel 4. Also noch ziemlich am Anfang. Die Kapitel bauen aufeinander auf, deswegen will ich auch keine großen Sprünge machen...
Wie könnte man dort die Schleife den einbauen ? Stehen nämlich gerade aufem Schlauch wie du das meinst...
Danke das du mir hilfst und Verbesserungen vorschlägst.
-
Kamen denn schon Schleifen vor? Wenn ja, benötigst du eine for()-Schleife, die über die komplette verbotenen-Wörter-Liste läuft - und in der Schleife den Vergleich mit dem i-ten Element.
(weniger Aufwand hast du, wenn du die STL-Algorithmen wie find() oder binary_search() verwendest, keine Ahnung, ob die schon an der Reihe waren)