line reversal指将多行字符串的行序整体倒置输出,而非每行字符反转;例如输入三行,输出时第三行变第一行、第一行变最后一行,空行保留,换行符需手动补全。

什么是 Line Reversal,不是字符反转
Line Reversal 指的是把输入的多行字符串按**行顺序倒过来输出**,而不是把每行内部的字符反转。比如输入:
hello world cpp
期望输出是:
cpp world hello
容易误以为是用 std::reverse 对每行调用 —— 那是字符级反转,和 Line Reversal 完全不同。
用 std::vector<:string></:string> 缓存所有行再倒序遍历
最直接可靠的做法:逐行读入,存进 std::vector,然后从后往前遍历输出。C++ 标准库没有“反向读文件”原语,所以缓存是必要步骤。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 用
std::getline逐行读取,避免operator>>跳过空行或截断含空格的行 -
std::vector支持随机访问,for (int i = lines.size() - 1; i >= 0; --i)可行,但更安全写法是用反向迭代器:for (auto it = lines.rbegin(); it != lines.rend(); ++it) - 注意:如果输入极大(GB 级日志),内存可能吃紧 —— 此时需改用两次文件遍历(先统计行数/偏移,再倒序读),但绝大多数场景不需要
遇到空行、Windows/Linux 换行符怎么办
std::getline 默认以 '\n' 为分隔符,能自动处理 \r\n(Windows)和 \n(Unix):它读到 \r\n 时,只丢弃 \n,\r 会留在字符串末尾。这会导致输出里出现意外的回车符。
- 简单过滤:读入后检查
line.back() == '\r',用line.pop_back()剔除(仅当确定输入可能含\r\n时) - 更健壮做法:用
std::string::erase清理行首行尾空白,例如line.erase(line.find_last_not_of(" \t\r\n") + 1),但 Line Reversal 本身不要求清洗内容,除非业务需要 - 空行会被正常读入为空字符串
"",也会被正常倒序输出 —— 这符合预期,无需特殊跳过
能否不用容器,边读边压栈再弹出
可以,用 std::stack<:string></:string> 逻辑等价,但实际没必要:
-
std::stack底层默认用std::deque,而std::vector内存连续、缓存友好,访问更快 -
std::stack不支持迭代器遍历,想输出必须循环pop(),这会销毁数据 —— 如果后续还需用原始行,就不可逆了 - 除非明确要求“只进不出”的抽象,否则
std::vector+rbegin()/rend()更直观、可控、调试友好
真正容易被忽略的是换行符兼容性和大文件内存边界 —— 其他都是语法细节。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










