C ++如何使用std :: sort和基于你的类的比较器'功能

时间:2017-01-21 16:09:29

标签: c++ sorting

我试图根据函数calculateDistance()返回的值对我的矢量进行排序,该函数返回double值。我猜这个问题是由permutationCopmarator方法引起的。 .cpp文件如下所示:

bool TSPgenetic::permutationComparator(int* i, int* j){
  return calculateDistance(i) < calculateDistance(j);
}

void TSPgenetic::chooseNewPopulation(){

  sort(population->begin(), population->end(), permutationComparator);
  sort(children->begin(), children->end(), permutationComparator);

`....`

}

标头文件片段:

bool permutationComparator(int*, int*);

1 个答案:

答案 0 :(得分:0)

传递permutationComparator作为std::sort的第三个参数无效。只有static个类成员才是有效的和functor对象。要解决此问题,请选择以下四个方法:

  • 使用lambda expression创建一个闭包对象并在那里进行比较。

    std::sort(population->begin(), population->end(), [](const int *i1, const int *i2){return calculateDistance(i1) < calculateDistance(i2);});
    
  • 如果您的比较函数不需要static,则可以使用std::bind

    auto comp_func = std::bind(&TSPgenetic::permutationComparator, this, std::placeholders::_1, std::placeholders::_2);
    std::sort(population->begin(), population->end(), comp_func);
    
  • 如果可能,请制作比较函数static

  • 在您的课程中重载bool operator () ( const int *i1, const int *i2 ),以使您的班级成为functor object

请注意,逻辑上比较函数不应该是成员函数。它是一个函数,它接受两个对象并确定它们的顺序。因此,几乎在所有情况下,只有第三个选项适用。