C ++ std :: sort自定义比较函数引用另一个列表

时间:2014-11-23 14:31:11

标签: c++ sorting vector compare

我是C ++的初学者,我不知道也无法找到解决问题的方法。

我试图以不寻常的方式对我的矢量进行排序,但却没有这样做。

pointsToVisit - 可以有开始时间和结束时间的Point对象列表。

visitedPoints - pointsToVisit vector

中Point对象的索引列表

我想按各点的值

对我的visitedPoints矢量进行排序
BeeHive
    std::vector<Point> pointsToVisit;
    std::vector<Route> routes;

Route
    std::vector<int> visitedPoints;

我的尝试如下:

bool BeeHive::isPointsVisitStartPrior (int i, int j) { return (pointsToVisit.at(i).startTime<pointsToVisit.at(j).startTime); }

Route BeeHive::sortRouteByStartTime(int routeIndex){
    Route route2 = Route();
    route2.setStartTime(routes.at(routeIndex).getStartTime());
    route2.setVisitedPoints(routes.at(routeIndex).getVisitedPoints());
    std::sort(route2.getVisitedPoints().begin()+1, route2.getVisitedPoints().end(), isPointsVisitStartPrior);
    evaluateRoute(route2);
    return route2;
}

我得到了这样的错误:

Error   5   error C3867: 'BeeHive::isPointsVisitStartPrior': function call missing argument list; use '&BeeHive::isPointsVisitStartPrior' to create a pointer to member c:\vrp projekt\vrp\vrp\beehive.cpp  193 1   VRP
Error   6   error C2780: 'void std::sort(_RanIt,_RanIt)' : expects 2 arguments - 3 provided c:\vrp projekt\vrp\vrp\beehive.cpp  193 1   VRP

我尝试完成工作的示例位于以下地址:http://www.cplusplus.com/reference/algorithm/sort/

我会感谢任何收到的帮助。


有可能,为我自己的目的创建冒泡排序会很好地替换std :: sort()吗?

2 个答案:

答案 0 :(得分:1)

isPointsVisitStartPrior是一个成员函数,这不能直接用于排序。您必须使用全局函数或函数对象。

如果您可以访问C ++ 11功能,则可以使用lambda:

std::sort(route2.getVisitedPoints().begin()+1, route2.getVisitedPoints().end(), 
[&](int i, int j){ return isPointsVisitStartPrior(i, j);  });

您还可以使用operator()创建一个类似

的仿函数对象
class VisitedPointsCompararer {
public:
   VisitedPointsCompararer(const std::vector<Point>& pointsToVisit): pointsToVisit(pointsToVisit) {
   }


   bool operator() (int i, int j) {
      return pointsToVisit.at(i).startTime < pointsToVisit.at(j).startTime;
   }

...

private:
   const std::vector<Point>& pointsToVisit;
}

答案 1 :(得分:1)

isPointsVisitStartPrior(int, int)是会员功能。这样,虽然它看起来需要两个参数,但它实际上隐含了三个:它还需要一个BeeHive*来操作(this指针)。

您需要做的是将BeeHive*“绑定”到电话:

using namespace std::placeholders;
std::sort(route2.getVisitedPoints().begin()+1, 
          route2.getVisitedPoints().end(), 
          std::bind(&BeeHive::isPointsVisitStartPrior, this, _1, _2)
     //   ^^^^^^^^^ without C++11, there's also boost::bind
);

这将保存this作为调用三参数函数的第一个参数,并将你调用它的下两个参数转发到下两个插槽中。

这在逻辑上等同于:

std::sort(route2.getVisitedPoints().begin()+1, 
          route2.getVisitedPoints().end(), 
          [this](int i, int j){ return isPointsVisitStartPrior(i, j); }
);

虽然使用lambda,但编译器可以为您内联调用。