【问题标题】:sort vector in increasing order of frequency of elements using stl使用 stl 按元素频率的递增顺序对向量进行排序
【发布时间】:2020-12-08 11:52:30
【问题描述】:

我正在尝试按频率递增的顺序对整数向量进行排序。我已经声明了一个存储整数计数的全局映射,并在自定义比较器中使用了它,但是我得到了错误的答案。在线检查时(here),我发现使用对的实现似乎工作正常。我做错了什么?

#include <bits/stdc++.h>
using namespace std;
unordered_map<int,int> m;

bool cm(int a,int b){
   if(m[a]<m[b])
       return true;
   return false;
}
int main(){
       int n;
       cin>>n;
       vector<int> v(n);
       
       for(int i=0;i<n;i++){
           cin>>v[i];
           m[v[i]]++;
       }

       sort(v.begin(),v.end(),cm);
}

【问题讨论】:

  • 您的代码无法编译。请拼凑一个minimal reproducible example
  • 对于我提供的示例输入,此代码对我有用。哪个测试用例失败了?
  • 请也发布您的结果,您提供的测试用例对我来说很好。
  • onlinegdb.com/BkrS_v9fw 也为该测试用例工作。有可能,当两个数字的频率匹配时如何处理?
  • 8 2 4 1 5 3 5 1 3 对于这个测试用例,我得到以下输出:2 4 1 5 3 5 1 3

标签: c++ sorting stl


【解决方案1】:

您的订单表明以相同频率出现的所有数字都是等价的。

例如,在

8 2 4 1 5 3 5 1 3

8、2 和 4 出现一次,1、3 和 5 出现两次,因此您有两组等效值。您在这些组中不定义排序。 所以输出结果也就不足为奇了

8 2 4 1 5 3 5 1 3

具有先出现一次的元素,然后是出现两次的元素,每个“部分”没有特定的顺序。

您需要一个同时将值计入计数的排序。
像这样的:

bool cm(int a,int b){
    return m[a] < m[b] || (m[a] == m[b] && a < b);
}

【讨论】:

  • 非常感谢,这就是我所缺少的。清除所有内容
  • @StPiere 不,不会。是什么让你这么认为?
  • 啊,监督你在比较器中使用全局地图。抱歉。
猜你喜欢
  • 1970-01-01
  • 2020-10-19
  • 2015-10-18
  • 2021-12-31
  • 2021-12-03
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
相关资源
最近更新 更多