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
有足够空间的情况下执行 a 就可以append
或+=
总共花费 O(n) 时间。但我同意这很尴尬。
std::move
与上述StringAppender
(即)一起使用sa += std::move(s1)
将显着提高非短字符串的性能(或将其与 xvalues 等一起使用)
我不知道 的复杂性std::ostringstream
,但ostringstream
它适用于漂亮的打印格式化输出,或者高性能不重要的情况。我的意思是,它们还不错,它们甚至可以执行脚本/解释/字节码语言,但是如果您赶时间,则需要其他东西。
像往常一样,您需要进行分析,因为恒定因素很重要。
一个 rvalue-reference-to-this operator+ 可能也是一个不错的选择,但很少有编译器实现对 this 的 rvalue 引用。