对字符串的数组/向量进行排序

Sort array/vector of string

本文关键字:排序 向量 字符串 数组      更新时间:2023-10-16

如何通过元素的重复排序数组/向量?例如

输入

Leo
Mike
Eric
Leo
Leo
<<p>输出strong> _ _ _ 或
Leo       Leo
Leo       Eric
Leo       Mike
Eric
Mike

我建议分3次处理数据:

  1. 使用std::sort获取所有相邻的重复元素

  2. 遍历排序范围,记录每个equal_range的长度和位置。

  3. 现在您可以根据在步骤2中恢复的数据恢复序列。如果希望二级搜索键按字母顺序排列,则可以考虑在此阶段使用stable_search。

我本想用文字解释这一点,让你写代码,但我发现我现在对c++很熟悉,对我来说写代码要容易得多。和史蒂夫说的略有不同。字符串的原始向量是v

std::map<std::string, int> m;
for(auto i=v.begin(); i!=v.end(); ++i)
    m[*i]++;
typedef std::pair<std::string, int> P;
auto comp_by_second = [](const P & lhs, const P & rhs) { return lhs.second < rhs.second; };
for(auto i=v.begin(); !m.empty(); )
{
    auto j = std::max_element(m.begin(), m.end(), comp_by_second);
    while(j->second-- > 0)
        *i++ = j->first;
    m.erase(j);
}

没有内置的方法可以做到这一点。一种相对简单的方法是构建包含每个元素计数的map<string, size_t>(只需迭代输入向量,对看到的每个字符串增加计数)。然后将映射中的所有键写入一个向量,并将该向量与比较器(用于比较映射中的数字)std::sort

这涉及到比严格必要的更多的映射查找,因此您可以从映射中编写一个对的向量,然后对这些对排序,最后从排序后的对创建字符串向量。