std::reverse最直接安全,接受两个迭代器原地反转容器元素;正确用法是s.begin()和s.end(),勿减1;它修改原对象,不返回新串;手动双指针需注意边界条件。

用 std::reverse 最直接安全
标准库提供现成工具,无需手写循环。它接受两个迭代器,对范围内的元素原地反转,适用于 std::string、std::vector 等所有支持随机访问的容器。
常见错误是传错迭代器边界,比如写成 s.begin(), s.end() - 1 —— 这会漏掉最后一个字符。正确写法始终是 s.begin(), s.end():
std::string s = "hello"; std::reverse(s.begin(), s.end()); // s 变为 "olleh"
注意:std::reverse 修改原字符串,不返回新对象;若需保留原串,请先拷贝。
手动双指针交换要注意边界条件
适合理解原理或嵌入式等不能依赖 STL 的场景。核心是用两个索引从两端向中间靠拢并交换字符。
立即学习“C++免费学习笔记(深入)”;
容易出错的地方包括:
- 循环条件写成
i 导致中间字符被多换一次(偶数长度时无害,奇数长度时把自己和自己换,问题不大;但逻辑冗余) - 忘记检查空字符串或单字符,其实
i 自然能覆盖这些情况 - 用
size_t做索引时,j初始化为s.length() - 1可能下溢(当s.empty()时s.length()是 0,减 1 变成极大正数)
更稳妥写法是用带符号整型或改用迭代器:
本文档主要讲述的是JSON.NET 简单的使用;JSON.NET使用来将.NET中的对象转换为JSON字符串(序列化),或者将JSON字符串转换为.NET中已有类型的对象(反序列化?)。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
std::string s = "world";
int i = 0, j = s.length() - 1;
while (i < j) {
std::swap(s[i++], s[j--]);
}
std::string 构造时反向迭代器最简洁
如果不需要修改原串,而是想快速得到一个反转副本,用反向迭代器构造新字符串是最少出错的方式:
std::string s = "test"; std::string reversed(s.rbegin(), s.rend()); // "tset"
这种写法天然规避了索引越界、类型溢出等问题,且语义清晰。性能上和 std::reverse + 拷贝基本一致,编译器通常能优化掉中间临时对象。
注意:rbegin() 和 rend() 是反向迭代器,不是普通指针,不能直接算术运算;也不能混用正向与反向迭代器构造。
用 std::string_view 时无法原地反转
std::string_view 是只读视图,没有可写数据。试图对它调用 std::reverse 会编译失败(因为 begin() 返回的是 const 迭代器)。
必须先转成拥有所有权的容器才能反转:
- 转
std::string:std::string(sview.begin(), sview.end()) - 或直接用反向构造:
std::string(sview.rbegin(), sview.rend())
别试图 cast 掉 const —— 那是未定义行为,而且现代编译器会报错。










