str.find-Frage



  • Hallo ich habe einen Text vorliegen und möchte gerne absuchen lassen, ob verschiedene Wörter darin vorkommen. Mit Str.find kann ich allerdings nur immer ein Wort suchen lassen z.B. morning. Wie kann ich das umschreiben, dass ich z.B. eine Wörterliste habe und der geht vom ersten bis zum letzten Wort alles durch und schaut ob eines der Wörter im Text vorkommt?
    Also so mach ich das im Moment, aber das Programm soll schaun, ob eines von 20 Wörtern vorkommt und dann Morgen melden. Da das ziemlich Zeilenintensiv ist wollte ich euch fragen wie ich das kürzer machen kann.

    if (text.find(morning) != std::string::npos) {
    std::cout << "Morgen" << '\n'}
    if (text.find(Morgen) != std::string::npos) {
    std::cout << "Morgen" << '\n'}
    


  • Mit stl-Mitteln wird es schwer.
    Evtl. könntest du es mit std::regex versuchen.

    Wenn es sich um lange Texte handelt, wirst du es wahrscheinlich selbst schreiben müssen, folgendes könnte dich interessieren:
    https://de.m.wikipedia.org/wiki/Suffixbaum



  • [blödsinn]



  • bool found = false;
    std::vector <std::string> words = {"erstes", "zweites" /*, ...*/};
    // std::vector <std::string> foundWords;
    for (auto const& word : words)
    {
        if (text.find(word) != std::string::npos))
        {
            found = true;
            break;
        }
        // or
        // if ...
        // foundWords.push_back(word);
        // je nachdem was du brauchst.
    }
    

    Warum gleich so kompliziert? (@Hlymur)

    Er kann sich ja immernoch danach über Geschwindigkeit beschweren, wenn er gigabeite große strings durchsuchen muss oder millionen an Wörtern suchen.

    EDIT: und für speziellen anderen suchkram gibt es immernoch boost string algorithm.

    Und für case insensitive search, gibt es std::search (c++11) oder boost string algorithm.

    EDIT 2: Nur so als Anregung: man könnte auch stumpf alle Wörter gleichzeitig in einer Iteration suchen. Etwas mehr Aufwand, der sich aber lohnt.



  • Danke erstmal wollte das nun versuchen da kam die Fehlermeldung
    "range-based 'for' loops are not allowed in C++98 mode"
    also als ich den vector mit den stringwords erstellen wollte 😞



  • Wie ich schon im anderen Thread sagte:

    Vielleicht solltest du einen aktuellen Compiler verwenden oder ihm sagen, dass er nach dem aktuellen Standard arbeiten soll.

    Wobei bei dir wohl einfach das passende Flag fehlt.



  • Falls die Aufgabe ist vollständige Wörter in einem String mit vollständigen Wörtern zu suchen, könnte man den String auch erstmal in Wörter zerlegen, und dann pro Wort gucken ob es eines der gesuchten ist. Das Nachgucken ob es eines der gesuchten Wörter ist kann man dann mit z.B. std::unordered_set machen, das wäre dann relativ performant.

    Ansonsten finde ich den Tip mit regex gut, da sehr schnell umzusetzen. Natürlich weiss man nie wie gut die Regex-Engine das dann wirklich optimiert, aber einen Versucht (gucken ob's schnell genug läuft) wäre es mMn. auf jeden Fall wert.


Log in to reply