关于修改函子的参数

About modifying the parameter of a functor

本文关键字:参数 修改 于修改      更新时间:2023-10-16

我有以下字符串对象的比较器

struct Comparator{
  int x;
  bool operator() (string a, string b) {
    int i = 1;
    if(a < b) {
      i = -1;
    } 
    i*= x;
    if(i==-1) {
      return true;
    } 
    return false;
  }
};

如您所见,它有一个参数 x.当它 = 1 时,字符串的比较是正常的,当它是 =-1 时,比较是反转的。

当在像sort这样的方法中使用它时,对于vector元素,我可以给这个比较器的对象实例以正确的x,但是当我想把这个比较器提供给像set这样的模板类时,我需要给出一个类而不是一个对象实例。所以我看到的唯一解决方案是使x静态。有没有更好的解决方案?

这是我想使用此比较器的 main 示例:

int main(int argc, char** argv)
{
  vector<string> vec;
  vec.push_back("c");
  vec.push_back("a");
  vec.push_back("b");
  Comparator comp;
  comp.x = 1; // for normal comparison
  comp.x = -1; // for inverse comparison
  sort(vec.begin(),vec.end(), comp); // here I can give the functor instance
  for(vector<string>::iterator it = vec.begin() ; it != vec.end(); it++)
  {
    cout << *it << endl;
  }
  set<string, Comparator> ss; // but here I must give the name of the functor class
  ss.insert("c");
  ss.insert("a");
  ss.insert("b");
  for(set<string>::iterator it = ss.begin() ; it != ss.end(); it++)
  {
    cout << *it << endl;
  }
  return 0;
}

set 的所有相关构造函数也采用Comp类的实例。

 set<string, Comparator> ss(Comparator(-1)); 

现在,您只需要一个构造函数,用于使用适当的值初始化其成员xComparator

也就是说,标准库已经附带了一个用于此目的的比较器类:

set<string, std::greater<std::string> > ss;

这是行不通的:a <a。>

你可以使用 std::string::compare:

bool operator() (const std::string& a, const std::string& b) {
    int result = a.compare(b) * x;
    return result < 0;
}