簡體   English   中英

C ++ std :: sort自定義比較函數引用另一個列表

[英]C++ std::sort custom compare function referencing to another list

我是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()?

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,但編譯器可能能夠為您內聯調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM