排序数组/矢量的字符串

时间:2011-04-11 14:38:15

标签: c++ string sorting

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

输入

Leo
Mike
Eric
Leo
Leo

输出 _ _ _或

Leo       Leo
Leo       Eric
Leo       Mike
Eric
Mike

3 个答案:

答案 0 :(得分:3)

我建议您在3次通过中处理您的数据:

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

  2. 迭代您的排序范围,记录每个equal_range的长度和位置。

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

答案 1 :(得分:1)

我本来希望用文字来解释这个并且你编写代码,但我发现我现在对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);
}

答案 2 :(得分:0)

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

这涉及到比严格必要的更多地图查找,因此您可以从地图中编写的向量,然后对这些对进行排序,最后从排序对中创建字符串向量。 / p>