关于修改仿函数的参数

时间:2014-04-08 14:31:10

标签: c++ templates stl functor

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

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静态。有更好的解决方案吗?

以下是我想使用此比较器的主要示例:

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;
}

2 个答案:

答案 0 :(得分:3)

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

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

现在,您只需要Comparator的构造函数,即使用适当的值初始化其成员x

也就是说,标准库已经为此目的提供了一个比较器类:

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

答案 1 :(得分:0)

这不起作用:a&lt; b不(!)表示b <一个。

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

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