我想根据频率对数组元素进行排序,但是我遇到了一些错误。请帮助纠正我的代码。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool comp(pair <int,int> &v1, pair<int,int> &v2){
if(v1.second == v2.second)
return v1.first < v2.first;
return v1.second > v2.second;
}
main(){
int n,a;
cin>>n;
vector < pair<int,int> > v;
vector < pair<int,int> >::iterator it;
for(int i=0;i<n;i++){
cin>>a;
it = find(v.begin(),v.end(),a);
if(it!=v.end()){
v[it-v.end()].second++;
}else{
v.push_back(make_pair(a,1));
}
}
sort(v.begin(),v.end(),comp);
for(it=v.begin();it!=v.end();it++){
int freq = it->second;
while(freq--){
cout<<it->first<<" ";
}
}
}
示例:
Input : arr[] = {2, 3, 2, 4, 5, 12, 2, 3, 3, 3, 12}
Output : 3 3 3 3 2 2 2 12 12 4 5
答案 0 :(得分:1)
您的代码中有两个明显的错误。
正如我在评论中所说的那样,将v[it-v.end()].second
替换为it->second
,这就是您通过编制索引来尝试做的事情。
其次,std::find
使用operator==
将您要查找的值与向量中的值进行比较。但您无法将int
与std::pair<int, int>
进行比较。相反,您应该使用std::find_if
并将int
与pair.first
进行比较。
还有一些不是错误的小事但是不好的做法:int n
似乎未被使用;并且不要在那里声明it
,只在你真正需要它的地方宣布它(同样,使用auto
,这样你就不必拼出那个长名称。)