最安全快捷的方式是直接调用 std::string 的字符重复构造函数(如 std::string(5, 'a')),但仅支持单字符;重复多字符字符串需手动预分配内存并循环拼接,同时须妥善处理空串、零次重复及内存分配异常等边界情况。

用 std::string 构造函数最安全快捷
直接调用 std::string 的重复构造函数是首选,它内部已做优化,不会触发多余内存分配或临时对象。传入重复次数和单个字符即可,但注意:它只能重复单个字符,不是整个字符串。
- 正确写法:
std::string(5, 'a')→"aaaaa" - 错误预期:
std::string(3, "ab")会编译失败——第二个参数必须是char,不是const char*或std::string - 若重复的是多字符字符串(如
"ab"),必须手动拼接,不能靠这个构造函数
重复任意字符串需手写循环或 append
标准库没提供原生的“重复子串”接口,得自己组合。推荐用 reserve 预分配内存,避免多次 realloc;再用 append 或 += 累加。不预分配在重复次数多时性能明显下降。
- 示例:
std::string repeat(const std::string& s, size_t n) { std::string result; result.reserve(s.size() * n); // 关键一步 for (size_t i = 0; i -
result += s和result.append(s)效果一致,但后者语义更清晰 - 如果
n是 0,reserve(0)合法且无副作用,不用额外判断
处理大重复次数时要防整数溢出和 OOM
当 n 很大(比如 1e6)且 s 不小(比如 1KB),s.size() * n 可能溢出 size_t,导致 reserve 接收错误值,后续 append 触发异常或崩溃。
- 检查溢出:
if (n > 0 && s.size() > std::string::npos / n)—— 这是标准做法,用std::string::npos作为最大值参考 - 更保守的做法:对
n设硬上限(如1000000),或改用流式生成(不一次性构造完整字符串) - 即使没溢出,
reserve成功也不代表内存一定够;append仍可能抛std::bad_alloc,生产代码应捕获
别忽略空字符串和零次重复的边界情况
空输入或零次重复看似简单,但容易在逻辑分支里漏掉,尤其当函数被嵌套调用或用于模板推导时。
-
repeat("", 100)应返回"",不是未定义行为 -
repeat("x", 0)必须返回空串,不能返回"x"或崩溃 - 如果用
for (size_t i = 0; i ,<code>n == 0时循环自动跳过,天然安全;但若用while (n--)就会出错(size_t下溢)
真正麻烦的不是写几行循环,而是溢出检查和空串路径是否覆盖全——这两个点在线上服务里一旦出问题,往往表现为偶发 crash 或内存耗尽,很难复现。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











