Als ein Beispiel für eine sehr einfache Struktur, die O(n)
Komplexität in C++ 11 hat:
template<typename TChar>
struct StringAppender {
std::vector<std::basic_string<TChar>> buff;
StringAppender& operator+=(std::basic_string<TChar> v) {
buff.push_back(std::move(v));
return *this;
}
explicit operator std::basic_string<TChar>() {
std::basic_string<TChar> retval;
std::size_t total = 0;
for(auto&& s:buff)
total+=s.size();
retval.reserve(total+1);
for(auto&& s:buff)
retval += std::move(s);
return retval;
}
};
Verwendung:
StringAppender<char> append;
append += s1;
append += s2;
std::string s3 = append;
Dies geschieht O (n), wobei n die Anzahl von Charakteren.
Schließlich, wenn Sie wissen, wie lang alle Strings sind, macht nur reserve
mit genügend Platz append
oder +=
insgesamt O (n) Zeit. Aber ich stimme zu, dass das peinlich ist.
Verwendung von std::move
mit dem oben StringAppender
(dh sa += std::move(s1)
) erhöht sich die Leistung erheblich für nicht-kurze Strings (oder die Verwendung mit XValues etc)
Ich weiß nicht, die Komplexität der std::ostringstream
, aber ostringstream
ist für Pretty Print formatierte Ausgabe oder Fälle, in denen hohe Leistung nicht wichtig ist. Ich meine, sie sind nicht schlecht, und sie können sogar Skript-/Interpretierungs-/Bytecode-Sprachen ausführen, aber wenn Sie in Eile sind, brauchen Sie etwas anderes.
Wie üblich müssen Sie profilieren, da konstante Faktoren wichtig sind.
Ein rvalue-reference-to-this-Operator + könnte auch ein guter sein, aber nur wenige Compiler implementieren rvalue-Referenzen zu diesem.
Also das ist eine C++ Frage? Warum ist es mit Java getaggt und warum ist das Beispiel in Java? –
Dieses Thema anzeigen? http://StackOverflow.com/Questions/2462951/c-eqivalent-of-stringbuffer-stringbuilder – taocp
Oder dieses: http://StackOverflow.com/Questions/7156122 – phs