错误 - 按频率对数组元素进行排序

时间:2018-02-17 12:57:59

标签: c++ stl

我想根据频率对数组元素进行排序,但是我遇到了一些错误。请帮助纠正我的代码。

#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

1 个答案:

答案 0 :(得分:1)

您的代码中有两个明显的错误。

正如我在评论中所说的那样,将v[it-v.end()].second替换为it->second,这就是您通过编制索引来尝试做的事情。

其次,std::find使用operator==将您要查找的值与向量中的值进行比较。但您无法将intstd::pair<int, int>进行比较。相反,您应该使用std::find_if并将intpair.first进行比较。

还有一些不是错误的小事但是不好的做法:int n似乎未被使用;并且不要在那里声明it,只在你真正需要它的地方宣布它(同样,使用auto,这样你就不必拼出那个长名称。)