使用+=或append()比+更高效,因+会频繁创建临时对象导致O(n²)复杂度,而append()结合reserve()可优化至接近O(n),适合循环拼接。

在C++中,string拼接是常见的操作,但不同方式的效率差异较大。最常用的方式是使用append()成员函数和+运算符。了解它们的性能差异,有助于写出更高效的代码。
1. + 号运算符:简单但可能低效
使用 + 拼接字符串看起来直观:
// 示例:使用 + 拼接std::string result = str1 + str2 + str3;
但问题在于:每次使用 + 都会创建一个新的临时 string 对象。原字符串内容被复制到新对象中,前一次的结果再与下一个字符串相加,导致多次内存分配和拷贝。尤其在循环中拼接时,性能下降明显。
例如:
立即学习“C++免费学习笔记(深入)”;
std::string s;for (int i = 0; i
s = s + "a"; // 每次都复制整个 s 再加 "a"
}
这段代码的时间复杂度接近 O(n²),因为每次拼接都要复制前面所有内容。
2. append() 函数:更高效的选择
append() 是 string 的成员函数,直接在原字符串末尾追加内容,避免创建临时对象。
std::string s;for (int i = 0; i
s.append("a"); // 直接修改 s,不复制整个字符串
}
只要底层缓冲区还有空间,append 就不会触发重新分配。即使需要扩容,STL 通常采用指数增长策略,将整体操作摊还为 O(n)。
另外,+= 运算符 在功能上等价于 append,且同样高效:
s += "a"; // 等同于 s.append("a")因此,在需要频繁拼接的场景下,优先使用 += 或 append()。
3. 提前预分配内存进一步优化
如果能预估最终字符串长度,调用 reserve() 可避免多次内存重分配:
std::string s;s.reserve(10000); // 预留足够空间
for (int i = 0; i
s += "some text";
}
这样几乎可以保证只发生一次内存分配,极大提升性能。
4. 总结:如何选择拼接方式
- 单次少量拼接(如两个字符串):+ 可接受,写法简洁。
- 循环内或大量拼接:必须使用 append() 或 +=,避免性能陷阱。
- 已知最终大小:配合 reserve() 使用,效率最高。
- 多个字符串拼接:考虑使用 stringstream 或 C++17 的 string_view 配合算法,视场景而定。
基本上就这些。关键点是:别让“看起来方便”的 + 号拖慢程序,特别是在热路径中。用 += 或 append,安全又高效。









