Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;std::对引用到另一个列表的自定义比较函数排序 我是C++初学者,我不知道也找不到解决问题的办法。< /P>_C++_Sorting_Vector_Compare - Fatal编程技术网

C++;std::对引用到另一个列表的自定义比较函数排序 我是C++初学者,我不知道也找不到解决问题的办法。< /P>

C++;std::对引用到另一个列表的自定义比较函数排序 我是C++初学者,我不知道也找不到解决问题的办法。< /P>,c++,sorting,vector,compare,C++,Sorting,Vector,Compare,我试图以一种不寻常的方式对向量进行排序,但没有成功 pointsToVisit—可以有开始时间和结束时间的点对象列表 visitedPoints-PointsToVisite向量中的点对象索引列表 我想根据各个点的值对visitedPoints向量进行排序 BeeHive std::vector<Point> pointsToVisit; std::vector<Route> routes; Route std::vector<int>

我试图以一种不寻常的方式对向量进行排序,但没有成功

pointsToVisit—可以有开始时间和结束时间的点对象列表

visitedPoints-PointsToVisite向量中的点对象索引列表

我想根据各个点的值对visitedPoints向量进行排序

BeeHive
    std::vector<Point> pointsToVisit;
    std::vector<Route> routes;

Route
    std::vector<int> visitedPoints;
我尝试在以下地址下开展工作的示例:

我将感谢得到的任何帮助



是否有可能,为我自己的目的创建冒泡排序会适当地替代std::sort()?

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

如果你有C++ 11的特性,你可以使用lambda:

std::sort(route2.getVisitedPoints().begin()+1, route2.getVisitedPoints().end(), 
[&](int i, int j){ return isPointsVisitStartPrior(i, j);  });
您还可以使用
操作符()
创建函子对象,类似于

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;
}
类访问点比较器{
公众:
访问点比较程序(const std::vector和pointsToVisit):pointsToVisit(pointsToVisit){
}
布尔运算符()(int i,int j){
返回点stovisit.at(i).startTime
isPointsVisitStartPrevior(int,int)是一个成员函数。这样的一个函数,虽然看起来需要两个参数,但实际上隐含地需要三个参数:它还需要一个
蜂巢*
,可以对其进行操作(
这个
指针)

您需要做的是将
蜂巢*
绑定到呼叫:

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

那么,我如何进入该点?“pointsToVisit”当时还没有定义。我没有设法让比较器工作,但我有一个其他性质的问题。向量是否使用气泡排序算法排序?如果是这样,那么我编写自己的排序方法会更快。我从文件“算法”中得到几个错误,如:“!”:对“void”类型的操作数无效;非法,右操作数的类型为“void”;“void”类型的条件表达式不合法;在“&&!”的Pred(&(&)的Pfirst,*(&)的Pfirst-1)),而(&(&)的First(&)的Pfirst(&)的DEBUG(&)的Pred(&)的Pred,*(&)的Pfirst)和&!(&)的Pred(&)的Pfirst,*((&)的Pfirst-1))--“你知道是什么原因吗?@Stranko你在用什么编译器?您可以发布完整的错误吗?@Stranko是否存在与
std::bind()
相关的错误或lambda的语法错误,具体取决于您正在执行的操作?我继续处理lambda,并复制了所有存在的错误。
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
);
std::sort(route2.getVisitedPoints().begin()+1, 
          route2.getVisitedPoints().end(), 
          [this](int i, int j){ return isPointsVisitStartPrior(i, j); }
);