首页 > 解决方案 > 如何调用比较器函数进行排序?

问题描述

我想使用“myfun”比较器函数在类内进行排序。有什么简单的方法可以做到这一点?

class Solution{
    public:
     //COMPATATOR  FUNCTION
      bool myfun(pair <string,string>a, pair <string,string>b){
        if(a.second==b.second){
            return a.first>a.first;
        }
        else{
            return a.second<b.second;
        }
    };

 // THE FUNCTION WHERE I WANT TO USE
    vector<string> winner(string arr[],int n)
    {
        unordered_map <string,int> dic;
        for (int i=0;i<n;i++){
            dic[arr[i]]+=1;
        }
        vector <vector<string>> li;
        for (auto name:dic){
            li.push_back({name.first,to_string(name.second)});
        }
        sort(li.begin(),li.end(),myfun);
        return li[0];
    }
};

目前它显示以下错误:

prog.cpp: In member function std::vector<std::__cxx11::basic_string<char> > Solution::winner(std::__cxx11::string*, int):
prog.cpp:34:39: error: invalid use of non-static member function
         sort(li.begin(),li.end(),myfun);

标签: c++classsorting

解决方案


将比较函数设为静态并决定是否需要一对字符串或字符串向量作为要排序的项目:(下面的配对版本;我还将另一个函数设为静态,因此我可以在没有实例的情况下调用它并制作比较器采用 const 引用。)

#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>

class Solution {
public:

    static bool myfun(const std::pair<std::string, std::string>& a, const std::pair<std::string, std::string>& b) {
        if (a.second == b.second) {
            return a.first > a.first;
        }  else {
            return a.second < b.second;
        }
    };

    static std::pair<std::string, std::string> winner(std::string arr[], int n)
    {
        std::unordered_map <std::string, int> dic;
        for (int i = 0; i < n; i++) {
            dic[arr[i]] += 1;
        }
        std::vector <std::pair<std::string, std::string>> li;
        for (auto name : dic) {
            li.push_back({ name.first, std::to_string(name.second) });
        }
        std::sort(li.begin(), li.end(), myfun);
        return li[0];
    }
};

int main() {

    std::string ary[5] = { "bbb","ccc","bbb", "aaa", "ccc"};
    auto result = Solution::winner(ary, 5);
}

但实际上,如果您只想返回第一个元素,则无需对列表进行排序,O(n log n)您可以在 中找到给定比较器的第一个元素O(n)


推荐阅读