mehrere strings zu einem zusammenfügen? HILFE ich kriegs nicht gebacken!



  • Hallo

    schau dir nochmal den Post von .filmor an

    bis bald
    akari



  • Wie schon gesagt, das erste muss in einen std::string-Konstruktor gepackt werden. Übrigens lässt sich das mit Stringstreams (die du ja scheinbar verwendest) auch lösen:

    #include <sstream>
    // ...
    
    std::stringstream s;
    
    str << "ping " << seg1 << '.' << seg2 << '.' << seg3 << '.' << seg4;
    
    s.str (); // == ping 123.213.123.123
    


  • Hallo,

    EDIT:
    bin ich lahm...

    Im Übrigen gibt es die VC++ 2005 Express Edition gratis zum Runterladen. Um Einiges besser (v.a. aktueller) als der VC6. Probier ihn doch mal aus. 🙂

    MfG

    GPC



  • ok danke habs hinbekommen

    @GPC: ich werds bei gelegenheit mal installieren



  • ach so...

    ich habe jetzt die variante von .filmor verwendet.

    Jetzt habe ich dazu eine frage:
    wenn ich das in einer schleife ausführen lasse, dann wird immer mehr drangehängt.

    Kann ich das irgendwie löschen lassen?

    s = "" funktioniert zwar in php aber hier nicht.
    Die funktion flush() die soweit ich weiss dafür gemacht ist variablen zu leeren funktioniert auch nicht (wenn das nicht richtig ist dann korrigiert mich bitte) .

    wie kann ich das bewerkstelligen das die variable gelöscht/geleert wird?



  • bifi5590 schrieb:

    wie kann ich das bewerkstelligen das die variable gelöscht/geleert wird?

    Du meinst wahrscheinlich die std::stringstream Lösung. Den stream-Inhalt kannst du hier ebenfalls über die Methode str() setzen.

    Beispiel:

    int main()
    {
        ostringstream iss;
        iss << "Hallo " << "Welt" << '!';
    
        cout << iss.str() << endl;
        iss.str(""); // leert den Stream.
        cout << iss.str() << endl;
    
        return 0;
    }
    

    Gruß Caipi



  • Um es nochmal zusammenzufassen: Es gibt std::string und std::ostringstream. std::strings kann ich wohl mit s = "" leeren, wobei s.clear() effizienter ist. Habe ich ein std::ostringstream, leere ich den mit s.str(std::string()). s.str("") geht auch, braucht aber möglicherweise mehrere Taktzyklen länger.

    Wenn es wirklich auf Performance ankommt, sollte man auch Konstrukte wie:
    s = s1 + s2 + s3 vermeiden. Effizienter wäre:

    s.clear();
    s += s1
      += s2
      += s3;
    

    Das vermeidet ein paar unnötige Allokationen. Aber in der Regel kann man die paar Taktzyklen verschmerzen zugunsten besserer Lesbarkeit des Codes.

    Tommi



  • Wird alles wegoptimiert...

    Wirklich lohnenswert wäre:

    string erg;
    erg.reserve(s1.size() + s2.size() + s3.size());
    erg = s1 + s2 + s3;
    


  • Nein.

    Deine Version mit reserve bringt nichts. Im Gegenteil. Es erzeugt eine unnötige Allokation.

    erg = s1 + s2 + s3;
    

    Bedeutet:
    operator+ für s1 und s2 (temporärer String)
    operator+ für den temporären String und s3
    operator=: verwerfe erg (also das, was mit reserve allokiert wurde) und ersetze das durch das Ergebnis des vorigen Ausdrucks.

    Ich habe es übrigens ausprobiert: Es ist sehr schwer, überhaupt Unterschiede zu messen. Ohne Optimierungsflags ist die Version mit reserve der klare Verlierer. Mit -O2 kann man das eher als Meßungenauigkeit abtun. Der klare Gewinner war eine Kombination aus unseren Varianten:

    std::string erg;
      erg.reserve(s1.size() + s2.size() + s3.size());
      erg += s1;
      erg += s2;
      erg += s3;
    

    Hier wird auch der Platz, der mit reserve allokiert wurde wirklich genutzt.

    Tommi



  • Danke an alle.

    ich habe jetzt die methode mit .str("") benutzt.

    auf jeden fall funnktioniert es jetzt! Nochmal danke an alle


Anmelden zum Antworten