2013-02-06 11 views
21

verketten Ich kenne einen der Vorteile der std::stringstream ist, dass es ein std::istream so kann es eine Eingabe von jeder Art akzeptieren, die operator<< zu std::istream, und auch von Primitiven Typen definiert.std :: string vs std :: string für viele Strings

Ich werde nicht verwenden operator<<; stattdessen werde ich nur viele Strings verketten. Ist die Implementierung von std::stringstream schneller als std::string zum Verketten vieler Strings?

+1

Im Vergleich zu was? '.append()'/'operator + ='? – Rapptz

+3

Ich denke, ein .reserve() gefolgt von mehreren .append()/+ = sollte ziemlich effizient sein. Zeichenfolgen sind in C++ nicht unveränderlich wie in Java/C#/etc. Daher gibt es keinen Grund für eine StringBuilder-Typklasse. – Bwmat

+0

@Rapptz Ja. 'append()' und 'operator + =' –

Antwort

26

Es gibt keinen Grund zu der Annahme, dass die anliegenden Funktionen von std::string langsamer sind als die Einfügefunktionen von stringstream. std::string wird im Allgemeinen nichts anderes als eine mögliche Speicherzuweisung/Kopie plus Kopieren der Daten in den Speicher sein. stringstream hat mit Dingen wie Locales usw. zu tun, auch für grundlegende Anrufe write.

Außerdem bietet std::string Möglichkeiten, alles außer der ersten Speicherzuweisung zu minimieren oder zu eliminieren. Wenn Sie reserve genügend Platz haben, ist jede Insertion etwas mehr als ein memcpy. Das ist mit stringstream nicht wirklich möglich.

Auch wenn es schneller als std::string ‚s Funktionen anhängt, haben Sie immer haben die Zeichenfolge aus dem stringstream zu kopieren etwas damit zu tun. Das ist also eine weitere Kopie, die Sie nicht benötigen mit std::string.

Sie sollten std::stringstream verwenden, wenn Sie Formatierung benötigen, nicht nur für das Zusammenkleben einiger Strings.

+0

Was nutze ich, wenn ich nur ein paar Saiten aneinander kleben muss? Ich weiß genau die Größe der resultierenden Zeichenfolge, also möchte ich sie vorallokieren, aber der Code, der Strings zusammenhält, benötigt einen OStream und verwendet '<<' für die Verkettung (es funktioniert mit 'std :: cout',' std :: cerr ',' std :: stringstream'), funktioniert aber nicht mit 'std :: string'. Muss ich wirklich nur einen kleinen Wrapper um 'std :: string' schreiben? – gnzlbg

+0

Ich habe gerade einen kleinen Wrapper um eine std :: string mit einem 'operator <<' geschrieben, der verkettet und das hat gut geklappt. Ich reserviere nur die endgültige Größe und nach dem Verketten verschiebe ich die Schnur. Fühlt sich an wie die Steinzeit: String hat 'append' und' operator + 'während' streams '' write' und 'operator <<' ... haben – gnzlbg

Verwandte Themen