std::reverse只接受一对可写迭代器,不返回值且就地修改;对string需用begin()/end(),C字符串要计算长度并排除'\0',vector不能传data()和size(),list应调用成员函数reverse()。

std::reverse 用法不对?先确认你传的是迭代器范围
直接调用 std::reverse 却没效果,大概率是传参错了——它不接受字符串对象或 C 风格数组名,只认一对迭代器。std::reverse 的作用域完全由你传入的两个迭代器决定,多一个、少一个字符都可能翻车。
- 对
std::string:必须传s.begin()和s.end(),不是s.data()或&s[0] - 对 C 字符串(
char*):得先算长度,用std::reverse(str, str + len),不能直接传str和nullptr - 对
std::vector<char></char>同理,别误以为能传v.data()和v.size()—— 第二个参数必须是迭代器,不是整数
reverse 是就地反转,不返回新字符串
有人写 auto reversed = std::reverse(s.begin(), s.end()); 然后发现 reversed 是 void,编译失败。这不是 bug,是设计如此:std::reverse 没有返回值,它只修改原容器。
- 想保留原串?得先拷贝:
std::string copy = s; std::reverse(copy.begin(), copy.end()); - 用在
const std::string&上会编译不过——因为begin()返回的是 const 迭代器,而std::reverse要求可写迭代器 - 如果真需要函数式风格(输入→输出),自己包一层:
std::string reversed(const std::string& s) { std::string r = s; std::reverse(r.begin(), r.end()); return r; }
char 数组用 reverse 容易越界或漏 '\0'
对栈上定义的 char buf[100] 调用 std::reverse 时,若按 buf 和 buf + 100 反转,会把末尾的 '<p>对栈上定义的 <code>char buf[100] 调用 std::reverse 时,若按 buf 和 buf + 100 反转,会把末尾的 '\0' 挪到开头,导致后续 printf 或 strlen 失效;若只反转到 strlen(buf),又容易忘记 +1 包含终止符。
printf 或 strlen 失效;若只反转到 strlen(buf),又容易忘记 +1 包含终止符。- 安全做法:先获取有效长度
size_t len = strlen(buf);,再反转std::reverse(buf, buf + len);(不包含'\0') - 反转后记得手动补
'\0':如果原来空间够,buf[len] = '\0';;否则必须确保目标缓冲区足够大 - 更稳妥的替代:改用
std::string,避免裸指针和边界计算
性能和兼容性:reverse 是 O(n),但别在循环里反复调用
std::reverse 内部是交换首尾元素,时间复杂度确实是线性的,但它的常数因子很小,基本不用优化。真正影响性能的是使用方式。
立即学习“C++免费学习笔记(深入)”;
- 别在 tight loop 里对同一个
std::string反复reverse又恢复——这等于做两倍无效拷贝 - 对
std::list不能用std::reverse(不满足 RandomAccessIterator),得用list.reverse()成员函数 - C++98 起就有,无兼容性问题;但若用在
std::basic_string_view上会失败——它迭代器不可写,只能转成std::string再操作
begin()/end() 的类型和可写性,比查文档更快定位问题。











