C++程序:按字母顺序重新排列单词的位置

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++ 中的算法函数和容器。

后端开发标签