O(n)
C ++ 11が複雑な、非常に単純な構造の例として、次のようになります。
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;
}
};
使用する:
StringAppender<char> append;
append += s1;
append += s2;
std::string s3 = append;
これにはO(n)が必要です。ここで、nは文字数です。
最後に、すべての弦の長さがわかっている場合は、reserve
十分なスペースを空けappend
て行うだけ+=
で、合計でO(n)時間がかかります。しかし、私はそれが厄介であることに同意します。
std::move
上記StringAppender
(つまり)で使用すると、sa += std::move(s1)
短い文字列以外の文字列のパフォーマンスが大幅に向上します(またはxvaluesなどで使用します)
の複雑さはわかりませんが、std::ostringstream
フォーマットされたostringstream
出力をきれいに印刷する場合や、高性能が重要でない場合に使用します。つまり、それらは悪くはなく、スクリプト化/解釈/バイトコード言語を実行することさえできるかもしれませんが、急いでいる場合は、何か他のものが必要です。
いつものように、一定の要因が重要であるため、プロファイルを作成する必要があります。
この演算子への右辺値参照+も良いものかもしれませんが、これへの右辺値参照を実装しているコンパイラはほとんどありません。