1. 前言
字符串数据类型是C++中常见的数据类型之一,而在字符串处理中,字符串中的单词排序是一个很常见的问题。本文将介绍如何使用C++编写一个程序,按照单词的字母顺序重新排列一句话中的单词。
2. 问题描述
假设有一串字符串,其中包含若干个以空格分隔的单词,现需要对这些单词进行排序,排序规则是按照每个单词中字母的字典顺序进行排序。
例如,对于字符串 "hello world how are you",排序后应为 "are hello how world you"。
3. 解题思路
为了完成单词排序,需要对字符串中每个单词进行分离,并且记录下每个单词在排序后的结果中的位置。将所有单词存入一个数组中,并以字母的字典顺序排序。最后,重新构造原始字符串,将单词按照其在排序数组中的位置顺序排列即可。
3.1 分离单词
可以通过遍历字符串中的每个字符来分离单词。当遇到空格时,就可以确定一个单词已经结束。需要注意的是,遇到空格需要跳过多个连续的空格。
std::string str = "hello world how are you";
std::vector words;
std::string word;
for (char c : str) {
if (c == ' ') {
if (!word.empty()) {
words.push_back(word);
word.clear();
}
continue;
}
word += c;
}
if (!word.empty()) {
words.push_back(word);
}
通过遍历字符串中的每个字符,可以将单词保存到一个 vector 中。上述代码中,words 为存储单词的 vector,word 为临时字符串,用来存储正在读取的单词。
3.2 按字典顺序排序
C++ 中的 std::sort 函数可以对数组进行排序,因此只需要将存储单词的 vector 转换为 C++ 数组,然后使用 std::sort 函数进行排序。在排序之前,可以使用 std::transform 函数将所有单词转换为小写字母,这样可以避免因为大小写问题导致的排序错误。
std::transform(words.begin(), words.end(), words.begin(),
[](std::string word) {
std::transform(word.begin(), word.end(), word.begin(),
[](unsigned char c) {
return std::tolower(c);
});
return word;
});
std::sort(words.begin(), words.end());
上述代码首先使用 std::transform 函数将每个单词都转换为小写字母,然后再使用 std::sort 函数对单词进行排序。
3.3 重构字符串
在完成单词排序之后,需要根据单词在排序数组中的位置顺序,重构原始字符串。可以使用 std::ostringstream 类来存储重构后的字符串。遍历排序数组,将单词依次加入到 std::ostringstream 中,并且在每个单词之后加入一个空格。
std::ostringstream oss;
for (const std::string& word : words) {
oss << word << ' ';
}
std::string result = oss.str();
if (!result.empty()) {
result.pop_back(); // 移除最后一个空格
}
4. 完整代码
根据上述思路,可以编写出完整代码:
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
int main() {
std::string str = "hello world how are you";
std::vector<std::string> words;
std::string word;
for (char c : str) {
if (c == ' ') {
if (!word.empty()) {
words.push_back(word);
word.clear();
}
continue;
}
word += c;
}
if (!word.empty()) {
words.push_back(word);
}
std::transform(words.begin(), words.end(), words.begin(),
[](std::string word) {
std::transform(word.begin(), word.end(), word.begin(),
[](unsigned char c) {
return std::tolower(c);
});
return word;
});
std::sort(words.begin(), words.end());
std::ostringstream oss;
for (const std::string& word : words) {
oss << word << ' ';
}
std::string result = oss.str();
if (!result.empty()) {
result.pop_back(); // 移除最后一个空格
}
std::cout << result << std::endl;
return 0;
}
5. 总结
本文介绍了使用C++编写程序,按照单词的字母顺序重新排列一句话中的单词的方法。在解题过程中,需要使用字符串的基本操作函数,如遍历字符串和分离单词等,还需要使用 C++ 中的算法函数和容器。