“按各单词反序重组排列”指将字符串中单词顺序整体反转,而非单词内字母倒序;核心是分词、逆序、拼接,推荐用std::istringstream自动跳过空白符提取单词,再用vector存储并反转,最后拼接。

什么是“按各单词反序重组排列”
这个词组容易误解。它不是把每个单词内部字母倒过来(比如 "hello" → "olleh"),而是把整个字符串中**单词的顺序反转**,比如 "I love coding" → "coding love I"。这是典型的“单词级逆序”,核心是**分词 + 逆序 + 拼接**。
用 std::istringstream 和 std::vector 最稳妥
手动用 find_first_of 或 substr 切分容易漏空格、制表符或连续空格。用 std::istringstream 自动跳过所有空白符最省心,也符合 C++ 标准做法。
实操建议:
- 声明
std::vector<:string></:string>存单词,避免动态拼接开销 - 用
std::istringstream逐个提取非空单词(自动忽略连续/首尾空白) - 用
std::reverse反转 vector,再用循环拼接,中间加单个空格 - 注意:如果原串全空或只含空白,结果应为空字符串,vector 会自然为空
std::string s = " hello world test ";
std::istringstream iss(s);
std::vector<std::string> words;
std::string word;
while (iss >> word) words.push_back(word);
std::reverse(words.begin(), words.end());
std::string result;
for (size_t i = 0; i < words.size(); ++i) {
if (i > 0) result += " ";
result += words[i];
}
用 std::stack 可省一次反转操作
如果只关心最终输出顺序,不需保留中间顺序,用栈天然后进先出,能绕过 std::reverse 调用,逻辑更直觉。
立即学习“C++免费学习笔记(深入)”;
但要注意:
- 栈本身不提供迭代器,必须弹出所有元素来构建结果,无法随机访问
- 若后续还需原单词顺序(比如调试或二次处理),栈就不可逆了
- 性能差异极小,除非单词数百万级,否则不必为这点优化牺牲可读性
别踩 std::string::find + substr 的坑
手写切分看似灵活,但极易出错:
-
find(" ")无法处理"\t"、"\n"、多个连续空格 - 忘记检查
npos导致无限循环或越界访问 - 末尾无空格时,最后一个单词被漏掉(常见于没写额外
substr补丁) - 用
erase(0, pos+1)修改原串,影响后续查找位置,逻辑混乱
除非明确要求保留原始空白结构(比如题目要求“保持原有空格数量”),否则别碰这种写法——它增加复杂度,却不解决实际需求。
真正难的不是写出来,而是让代码在 " a b\tc\n" 这种输入下仍输出 "c b a" —— 用 istringstream 就一行循环搞定,其余都是干扰项。


















