std::regex_replace可一行简化连续空格替换但性能差;双指针原地遍历更高效,时间O(n)空间O(1),且正确处理开头、结尾及全空格等边界情况。

用 std::regex_replace 一行搞定(但要注意性能)
如果你只处理短字符串、且项目已启用 C++11 以上并允许正则,std::regex_replace 最简洁:
std::string s = "a b c";
s = std::regex_replace(s, std::regex(" +"), " ");它把所有连续空格(至少一个)替换成单个空格。但注意:std::regex 在某些标准库实现(如 libstdc++)中性能较差,对长文本或高频调用可能拖慢程序。
手写双指针遍历更可控、更高效
真正稳定又快的做法是原地覆盖:用两个索引,一个读(i),一个写(j),跳过重复空格。
std::string removeConsecutiveSpaces(std::string s) {
if (s.empty()) return s;
int j = 0;
for (int i = 0; i < s.length(); ++i) {
if (s[i] != ' ' || (j > 0 && s[j-1] != ' ')) {
s[j++] = s[i];
}
}
s.resize(j);
return s;
}关键逻辑是:只在「当前字符不是空格」或「当前是空格但前一个写入字符不是空格」时才写入。这样避免了额外容器分配,时间 O(n),空间 O(1)(不计返回值拷贝)。
为什么不用 std::unique?
std::unique 只能去重相邻相等元素,但它会把“多个空格”压缩成“一个空格”,同时也会把其他重复字符(如 "aa" → "a")一并处理——这不符合“仅处理连续空格”的需求。
- 它不区分字符类型,无法限定只对空格生效
- 若字符串含其他重复字母,结果会被意外修改
- 返回的迭代器需配合
erase,多一次移动
边界情况必须手动验证
实际使用时容易漏掉这些:
- 开头连续空格:
" hello"→ 应为" hello"(注意开头保留一个) - 结尾连续空格:
"hello "→ 应为"hello " - 全空格:
" "→ 应为" "(不是空串) - 空串或单字符直接返回,避免越界访问
j == 0 时的空格判断。


















