关于在C++中对字符串进行排序

About Sorting String In C++

本文关键字:字符串 排序 C++      更新时间:2023-10-16

如何仅根据每个单词的长度在字符串中对单词进行稳定的排序,以便最长的单词排在最前面,最短的单词排在最后(但相同长度的单词保持其相对于彼此的原始顺序)?

例如:输入:

sj a sa df r e w f d s a v c x z sd fd

结果输出:

sj sa df sd fd a r e w f d s a v c x z

最简单的解决方案是将字符串拆分为字符串集合,然后对该集合进行排序并将结果再次连接成字符串: 您可以使用字符串大小的自定义比较器,并将其与字符串集合一起馈送到std::stable_sort以进行排序:

// Your original string
std::string your_string = "sj a sa df r e w f d s a v c x z sd fd";
// Split the string
std::istringstream iss(your_string);
std::vector<std::string> words{
    std::istream_iterator<std::string>(iss),
    std::istream_iterator<std::string>()
};
// Stable sort by size
std::stable_sort(std::begin(words), std::end(words), [](const std::string& lhs, const std::string& rhs) {
    return lhs.size() > rhs.size();
});
// Merge the results back with spaces
std::ostringstream oss;
std::copy(
    std::begin(words), std::end(words),
    std::ostream_iterator<std::string>(oss, " ")
);
your_string = oss.str();

当然,这个算法不是最优的。为了避免大量的计算,您可以直接存储一个字符串向量并使用它,而不是将单词存储在空格分隔的字符串中。在次优事物中:我们从原始字符串中复制许多东西,而有些东西可能会在words向量中移入和移出(不确定)。我们剥离空间以重新添加它们这一事实清楚地暗示了我们正在做的比我们能做的更多。

另外,请注意,最后一个字符串将有一个额外的尾随空格,您可以选择使用 pop_back 删除该空格。