问题描述
我正在编写一个必须使用自定义排序的程序,所以我创建了一个自定义比较器“ comp”,但是在C ++类中使用它,给出了“ 必须调用对非静态成员函数的引用”,我使用静态布尔comp()修复了此问题。但是在将比较器函数设为静态后,出现错误“ 在静态成员函数中无效使用成员'mat'”。我该怎么办?
我叫 sort(str.begin(),str.end(),comp()),而从“ comp” 中,我叫“ comp _()” 。我不得不以其他方式对字符串进行排序。
class Solution {
public:
int mat[26][26];
static bool comp_(char a,char b,int i) {
if (i == 26) {
return a<b;
}
if (mat[a-'A'][i] > mat[b-'A'][i]) {
return true;
}
else if (mat[a-'A'][i] < mat[b-'A'][i]) {
return false;
}
return comp_(a,b,i+1);
}
static bool comp(char a,char b) {
return comp_(a,0);
}
解决方法
技巧是在Solution
类上定义一个调用操作符,以便可以将其用作传递给std::sort()
调用的Comparator对象,如下所示:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int mat[26][26];
bool comp(char a,char b,int i) const {
if (i == 26) {
return a<b;
}
if (mat[a-'A'][i] > mat[b-'A'][i]) {
return true;
}
else if (mat[a-'A'][i] < mat[b-'A'][i]) {
return false;
}
return comp(a,b,i+1);
}
bool operator()(const char & a,const char & b) const
{
return comp(a,0);
}
};
int main(int argc,char ** argv)
{
std::vector<char> str;
str.push_back('d');
str.push_back('c');
str.push_back('b');
str.push_back('a');
Solution sol;
std::sort(str.begin(),str.end(),sol);
for (size_t i=0; i<str.size(); i++) std::cout << str[i] << std::endl;
return 0;
}
这样,Solution
对象中的方法不必是静态的,因此它们可以访问mat
成员变量。