大规模重复连接需预分配内存,先求总长再调 reserve();单字符重复应直接用 std::string(count, ch);避免 substr() 隐式拷贝,改用 append(s, pos, len) 或 string_view 零拷贝;reserve 不改变 size(),需手动写入内容。

大规模重复连接必须预分配内存,否则 append() 或 += 会退化成 O(n²) 行为——这不是“慢一点”,而是数据量翻倍时耗时可能翻 4 倍以上。
先算总长再调用 reserve(),别在循环里边拼边 reserve
常见错误是每次追加前都 reserve(s.size() + add_len),这等于没 reserve:容量仍按指数增长,realloc 次数不减。真正有效的做法是把所有要拼的字节数一次性加总,再调一次 reserve()。
- 多字符重复(如
"abc"重复 1000 次):result.reserve(pattern.size() * repeat) - 混合长度子串重复(如 vector 中多个
string_view):先遍历求和,再reserve(total_len) - 留 5–10% 余量更稳妥,避免因边界对齐或内部 padding 触发最后一次扩容
单字符重复直接用构造函数,别走循环
std::string(count, ch) 是唯一无需 reserve() 的重复方式,底层调用 memset,零迭代、零检查。写 for 循环 append(1, ch) 不仅慢 10 倍以上,还容易误写成 append('x') 导致编译失败。
- 正确:
std::string line(80, '-');、std::string zeros(1024, '\0'); - 错误:
std::string s; for (int i = 0; i < 80; ++i) s.append("-", 1);
重复子串时避免 substr() 隐式拷贝
result.append(s.substr(0, 3), 4) 看似简洁,但 substr() 先分配新堆内存拷贝 3 字节,再追加 4 次——白费一次分配。尤其当 s 很大而只取前几字节时,浪费更明显。
立即学习“C++免费学习笔记(深入)”;
- 安全高效写法:
for (int i = 0; i < 4; ++i) result.append(s, 0, 3); - 务必提前校验:
if (s.size() >= 3) { ... },否则append(s, 0, 3)会崩溃 - 若源是
string_view,直接result.append(sv.data(), sv.size()),零拷贝
最容易被忽略的是:reserve 后 size() 仍是 0,capacity() 才变大;你得用 append() 或 += 写入内容,不能指望 reserve 自动填满字符串。


















