如何通过重复元素对数组/向量进行排序? 例如
输入
Leo
Mike
Eric
Leo
Leo
输出 _ _ _或
Leo Leo
Leo Eric
Leo Mike
Eric
Mike
答案 0 :(得分:3)
我建议您在3次通过中处理您的数据:
使用std :: sort来获取彼此相邻的所有重复元素。
迭代您的排序范围,记录每个equal_range的长度和位置。
现在,您可以根据在步骤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>