2014-11-23 87 views
1

我是C++的初學者,我不知道也找不到解決我的問題的方法。C++ std ::排序自定義比較函數引用到另一個列表

我想以一種不尋常的方式對我的向量進行排序,但未能這樣做。

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()嗎?

回答

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; 
} 
+0

我該如何訪問Point?那麼「pointsToVisit」是未定義的。 – Stranko 2014-11-23 14:39:00

+1

查看我的更新回答 – Jasper 2014-11-23 14:51:36

+0

我沒有設法讓比較器工作,但我有一個其他性質的問題。該矢量是否使用冒泡排序算法進行排序?如果是這樣的話,我自己寫分類方法會更快。 – Stranko 2014-11-23 17:14:19

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); } 
); 

雖然與拉姆達,編譯器能夠內聯你的電話。

+0

我從文件「算法」中得到幾個錯誤:'!' :對'void'類型的操作數是非法的;非法,右操作數的類型爲'void'; 「void」類型的條件表達式是非法的;在 「&& _Pred!(* _ Pfirst,*(_ Pfirst - 1)))」 的「,而(_First <_Pfirst \t \t && _DEBUG_LT_PRED(_Pred,*(_ Pfirst - 1),* _Pfirst) \t \t && _Pred! (* _Pfirst,*(_Pfirst - 1))) \t \t --_ Pfirst;「 任何想法可能會造成這種情況? – Stranko 2014-11-23 15:32:57

+1

@Stranko你在用什麼編譯器?你能發佈完整的錯誤嗎? – Barry 2014-11-23 15:36:10

+0

VisualStudio 2012; http://pastebin.com/MbF2BQUS – Stranko 2014-11-23 15:39:43

相關問題