【问题标题】:About Sorting String In C++关于 C++ 中的字符串排序
【发布时间】:2016-01-26 18:07:40
【问题描述】:

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

例如: 输入:

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

【问题讨论】:

  • 向我们展示一些您尝试过的代码
  • 对不起,我不明白你在说什么。英语是一门难学的语言!请让比你更流利的人来写这个问题。
  • 可以举个例子试试。
  • 我在 C 中尝试过,但在许多论坛或博客中我得到了一些提示和代码.. 他们做到了配对
  • 您是在对字符串中的字符还是在std::string的向量中进行排序?

标签: c++ sorting


【解决方案1】:

最简单的解决方案是将字符串拆分为字符串集合,然后对该集合进行排序并将结果再次连接成字符串:您可以使用自定义比较器使用字符串的大小并将其提供给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 删除它。

【讨论】:

  • 我只是从流中初始化 words 而不是显式副本: std::vector<:string> words { std::istream_iterator<:string>(iss ), std::istream_iterator<:string>() };`
  • @JerryCoffin 哦,对了,它让事情变得更简单了。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 2020-01-29
  • 2016-01-29
  • 2012-03-10
  • 2014-06-13
相关资源
最近更新 更多