string-problem



  • wahrscheinlich wie viele wie cplusplus_ schon geschrieben hat



  • Ich würds so machen:

    #include <algorithm>
    #include <string>
    
    // ...
    
    std::string s = "Hallo Du Da Ich Bin Heute Nicht Mehr Da!";
    std::size_t n = std::count(s.begin(), s.end(), ' ');
    


  • std::count aus <algorithm>
    Zaehlt doch nur, in diesem fall, die ' ' zeichen, oder nicht?



  • Ja. Darum gings doch, oder?



  • @_Till_
    das 2. nicht so wie cplusplus_



  • blublub schrieb:

    @_Till_
    das 2. nicht so wie cplusplus_

    #include <algorithm>
    #include <iostream>
    #include <string>
    
    int main()
    {
        std::string str = "hallo hallo hallo";
        str.erase(std::remove(str.begin(), str.end(), ' '), str.end());
        std::cout << str << std::endl;
    }
    


  • sollte es nicht

    #include <algorithm>
    #include <iostream>
    #include <string>
    
    int main()
    {
        std::string str = "hallo hallo hallo";
        str.erase(std::find(str.begin(), str.end(), ' '), str.end());
        std::cout << str << std::endl;
    }
    

    oder

    #include <algorithm>
    #include <iostream>
    #include <string>
    
    int main()
    {
        std::string str = "hallo hallo hallo";
        std::remove(str.begin(), str.end(), ' ');
        std::cout << str << std::endl;
    }
    

    sein?
    Denn std::remove loescht doch schon. und string::erase(it) loescht dann ja den string?!

    Sorry wenn ich dich das frage @ChrissiB, aber algo kenne ich nicht so gut (noch).

    MFG GHost



  • Heh. Ich war grad auf der Schiene:

    try { while(true) s.erase(s.find(' '), 1); } catch(std::out_of_range &e) { }
    

    ...aber ChrissiB's Ansatz ist besser.

    @Green_Ghost: Schau nochmal in die Doku, std::remove verändert den end()-Iterator nicht. Das heißt, bei deinem zweiten Beispiel käme "hallohallohallolo" raus. Dein erstes Beispiel würde alles nach dem ersten Leerzeichen löschen.



  • Green_Ghost schrieb:

    sollte es nicht

    #include <algorithm>
    #include <iostream>
    #include <string>
    
    int main()
    {
        std::string str = "hallo hallo hallo";
        str.erase(std::find(str.begin(), str.end(), ' '), str.end());
        std::cout << str << std::endl;
    }
    

    Wenn du das machst, wird alles nach dem ersten Fund gelöscht. find() gibt einen Iterator auf das zuerst gefundene Elemnt zurück. D.h. es bleibt in str nur noch "hallo" 😉 Das will er ja nicht haben.

    oder

    #include <algorithm>
    #include <iostream>
    #include <string>
    
    int main()
    {
        std::string str = "hallo hallo hallo";
        std::remove(str.begin(), str.end(), ' ');
        std::cout << str << std::endl;
    }
    

    sein?
    Denn std::remove loescht doch schon. und string::erase(it) loescht dann ja auch noch...

    std::remove löscht nicht, es verschiebt bloß die nicht zu löschenden Elemente nach vorne. Da du aber noch immer die anderen Elemente im String hast musst du die nun löschen mitteles erase(). 🕶

    Sorry wenn ich dich das frage @ChrissiB, aber algo kenne ich nicht so gut (noch).

    MFG GHost

    Wer nicht fragt, bleibt dumm. 🙄



  • verstehe, danke.
    hier lernt man was 😉


Anmelden zum Antworten