Frage zu Strings und Iteratoren



  • Hallo,
    kann mir jmd. sagen warum dieser Ausdruck legitim ist:

    std::string const stext("alphaomega"); //10
    	std::string const rtext("alp"); //3
    
    	std::string neWW(stext.begin(), stext.end()-7);
    
    	std::cout << "\n\n" << (neWW == rtext);
    	/*std::cout << ((rtext.begin(), rtext.end()) == (stext.begin(), stext.end()-8)); --- Funktioniert auch!*/
    

    dieser jedoch nicht:

    std::string const stext("alphaomega"); //10
    	std::string const rtext("alp"); //3
    
    	std::cout << "\n\n" << (neWW == (stext.begin(), stext.end()-7));
    

    Der letzte Ausdruck wirft eine rießige Menge an Compilerfehlern, diese beziehen sich teilweise auf die Headderdatei basic_string.

    Hoffe jmd. kann mir helfen,
    MfG


  • Mod

    Was du da tust macht garantiert nicht was du denkst. Es nutzt den Kommaoperator der alle Ausdrücke, abgesehen vom Rechtesten, ignoriert. (Sie werden ausgewertet, aber das wars auch)

    ((rtext.begin(), rtext.end()) == (stext.begin(), stext.end()-8))
    

    Äquivalent zu

    rtext.end() == stext.end()-8
    

    Und

    (neWW == (stext.begin(), stext.end()-7))
    

    Ist äquivalent zu

    neWW == stext.end()-7
    

    Einen String mit einem Iterator zu vergleichen ist Unsinn, daher die Fehlermeldung.

    Um Ranges zu vergleichen nutze std::equal , aber std::string s kannste einfach per == vergleichen.



  • Danke erstmal.
    Mein Ziel ist, mein Pattern rtest nur mit einem Präfix des Texts stext vergleichen, nicht dem kompletten String.

    Mit

    std::string neWW(stext.begin(), stext.end()-7)
    

    wollte ich neWW mit einem Präfix von stext initialisieren, was ja geklappt hat.
    Da ich jedoch verschiedene Präfixe Schleifenartig abgleichen will, war das mit der Zuweisung aber ungünstig.

    Gibt es dafür einen schlichten Ansatz der nur mit Iteratoren und Strings arbeitet, oder muss ich dafür auf eine std-Funktion zurückgreifen?
    Mir geht es hier auch ums Verständniss, deshalb möchte ich nur die nötigsten std-Funktionen verwenden.



  • tata schrieb:

    Mein Ziel ist, mein Pattern rtest nur mit einem Präfix des Texts stext vergleichen, nicht dem kompletten String.

    Mit string::compare() kann man auch Teilstrings vergleichen, unter Angabe von Position + Länge des Teilstücks. Wenn Du Iteratoren bevorzugst, das von Arcoth genannte std::equal() .

    Es ist nicht verkehrt, eine STL-Funktion zu nutzten, wenn sie die Aufgabe erfüllt, statt dies von Hand nachzubauen.


Anmelden zum Antworten