我是C++的初学者,我不知道也找不到解决问题的方法。
我试图以一种不寻常的方式对我的向量进行排序,但没有这样做。
点访问 - 可以具有开始时间和结束时间的点对象的列表。
visitedPoints - 来自 pointsToVisit 向量的 Point 对象的索引列表
我想按相应点的值对我访问的点向量进行排序
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 projektvrpvrpbeehive.cpp 193 1 VRP
Error 6 error C2780: 'void std::sort(_RanIt,_RanIt)' : expects 2 arguments - 3 provided c:vrp projektvrpvrpbeehive.cpp 193 1 VRP
我尝试完成工作的示例位于以下地址下:http://www.cplusplus.com/reference/algorithm/sort/
我将感谢收到的任何帮助。
是否有可能,为我自己的目的创建气泡排序会体面地替换 std::sort() ?
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;
}
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,编译器可能能够为您内联调用。