c++ - 如何调用比较器函数进行排序?
问题描述
我想使用“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);
解决方案
将比较函数设为静态并决定是否需要一对字符串或字符串向量作为要排序的项目:(下面的配对版本;我还将另一个函数设为静态,因此我可以在没有实例的情况下调用它并制作比较器采用 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)
。
推荐阅读
- python-3.x - Keras 图层特征标签
- vue.js - vuetify 更改选项卡事件
- javascript - 使用css更改交通灯通过添加javascript来控制计时器
- angular - 当以角度选择另一个选择输入时如何重置一个选择输入的值
- reactjs - React 如何更新组件
- android - 在 webView Android 中打开键盘时如何隐藏导航栏?
- reactjs - 在 AWS CodeDeploy 管道上构建输出
- java - 如何使用 java 流按值对 Map 进行排序?
- java - BCrypt:使用 Spring Security 的空编码密码
- python - 对 selenium 中的元素执行重复单击