【问题标题】:C++ std::sort custom compare function referencing to another listC++ std::sort 自定义比较函数引用另一个列表
【发布时间】:2014-11-23 14:31:11
【问题描述】:

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

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

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

visitedPoints - pointsToVisit 向量中 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() 体面?

【问题讨论】:

    标签: c++ sorting vector compare


    【解决方案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;
    }
    

    【讨论】:

    • 那么我如何访问Point?那么“pointsToVisit”是未定义的。
    • 我没有设法让 Comparator 工作,但我有一个其他性质的问题。向量是否使用冒泡排序算法排序?如果是这样,那么我编写自己的排序方法会更快。
    【解决方案2】:

    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,编译器可能能够为您内联调用。

    【讨论】:

    • 我从文件“算法”中得到几个错误,例如:'!' : 对“void”类型的操作数是非法的;非法,右操作数的类型为“void”; 'void' 类型的条件表达式是非法的;在 "&& !_Pred(_Pfirst, *(_Pfirst - 1)))" 的 "while (_First _Pfirst, *(_Pfirst - 1))) --_Pfirst;"知道是什么原因造成的吗?
    • @Stranko 你用的是什么编译器?你能发布完整的错误吗?
    • @Stranko 是否存在与未找到 std::bind() 或 lambda 语法错误相关的错误,具体取决于您在做什么?
    • 我继续使用 lambda,并复制了所有存在的错误。
    猜你喜欢
    • 2020-10-02
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多