Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++ 如何在c++;对类中的某些值进行排序?_C++_List_Sorting - Fatal编程技术网

C++ 如何在c++;对类中的某些值进行排序?

C++ 如何在c++;对类中的某些值进行排序?,c++,list,sorting,C++,List,Sorting,我有一个名为Graph的类,在这个类中我有一个名为V的成员,它是一个向量。我有一个名为Edge的结构和一个Edge列表。如下图所示: struct Edge{ int u; int v; Edge(int u,int v){ this->u=u; this->v=v; } }; struct Vertex{ int d; int f; . . . } class Graph{ vector < Vertex > V; . .

我有一个名为Graph的类,在这个类中我有一个名为V的成员,它是一个向量。我有一个名为Edge的结构和一个Edge列表。如下图所示:

struct Edge{
 int u;
 int v;
 Edge(int u,int v){
   this->u=u;
   this->v=v;
 }
};
struct Vertex{
 int d;
 int f;
 .
 .
 .
}

class Graph{
  vector < Vertex > V;
  .
  .
  .
  int edgeCmp(Edge* x,Edge* y){
    return ( V[x->v].d < V[y->v].d )?1:0;
  }
  void someFunction(){
   list<Edge> backEdges;
   backEdges.sort(&Graph::edgeCmp);
  }
}
struct-Edge{
国际大学;
INTV;
边缘(整数u,整数v){
这个->u=u;
这个->v=v;
}
};
结构顶点{
int d;
int f;
.
.
.
}
类图{
向量<顶点>V;
.
.
.
int edgeCmp(边*x,边*y){
返回(V[x->V].dV].d)?1:0;
}
void函数(){
列出后缘;
backEdges.sort(&Graph::edgeCmp);
}
}
但是它不起作用!!有人能帮我做这样的事吗?我得到这个错误:

错误3错误C2064:该术语的计算结果不是采用2个参数的函数c:\program files\microsoft visual studio 9.0\vc\include\xutility 346

它无法理解我正在调用包含2个参数的函数。我不知道为什么

return (V[x->v].dv].d)?1:0;
这一行有不平衡的括号,读起来很可怕(我怀疑前者是后者的结果)。如果看不到Vertex类,就很难说它应该做什么——在修复括号之后,也许应该重新格式化以提高可读性


这一行有不平衡的括号,读起来很可怕(我怀疑前者是后者的结果)。如果看不到Vertex类,就很难说它应该做什么-在修复括号后,也许应该重新格式化以提高可读性。

您不能使用成员函数作为比较器。成员函数需要
指针,该指针不能从
排序
传递

相反,您必须创建一个函数对象来包含额外的信息,如:

class Graph{
  vector < Vertex > V;

  struct EdgeComparer {
     const vector<Vertex>& V;
     EdgeComparer(const vector<Vertex>& vertices) : V(vertices) {}
     bool operator() (const Edge& a, const Edge& b) const {
        return V[a.v].d < V[b.v].d;
     }
  };

  ...

  EdgeComparer ec (V);
  backEdges.sort(ec);
类图{
向量<顶点>V;
结构边缘比较器{
常数向量&V;
边比较器(常量向量和顶点):V(顶点){}
布尔运算符()(常数边和a、常数边和b)常数{
返回V[a.V].d

请注意,因为您有一个
Edge
列表,而不是
Edge*
,所以比较器的输入参数不应该是
Edge*
。我已将这些参数更改为
const-Edge&
,您不能将成员函数用作比较器。成员函数需要
指针,而该指针不能从
传递>排序

相反,您必须创建一个函数对象来包含额外的信息,如:

class Graph{
  vector < Vertex > V;

  struct EdgeComparer {
     const vector<Vertex>& V;
     EdgeComparer(const vector<Vertex>& vertices) : V(vertices) {}
     bool operator() (const Edge& a, const Edge& b) const {
        return V[a.v].d < V[b.v].d;
     }
  };

  ...

  EdgeComparer ec (V);
  backEdges.sort(ec);
类图{
向量<顶点>V;
结构边缘比较器{
常数向量&V;
边比较器(常量向量和顶点):V(顶点){}
布尔运算符()(常数边和a、常数边和b)常数{
返回V[a.V].d

请注意,因为您有一个
Edge
列表,而不是
Edge*
,所以比较器的输入参数不应该是
Edge*
。我已将这些参数更改为
const-Edge&

,下次使用101010按钮格式化代码。下次使用101010按钮格式化代码。我添加了Vertex-struct,但情况并非如此.我得到的错误如下:项不计算为取2的函数arguments@Morte尝试将
edgeCmp
声明为
static
。此外,您应该将返回类型更改为
bool
,并删除
?1:0
部分。我添加了Vertex结构,但事实并非如此。我得到的错误如下所示:term的计算结果不为a函数获取2arguments@Morte尝试将
edgeCmp
声明为
static
。此外,您应该将返回类型更改为
bool
,并删除
?1:0
部分。谢谢!它很有效。但您可以向我解释一下吗?我不能很好地理解它。@Morteza:
。sort
可以接受任何可以是c的对象
f
函数是其中一种明显的类型,但是带有重载的
操作符()的类(结构)也是如此
。后者被称为函数对象。与普通函数相比,它的优点是可以存储任意状态,就像这里所做的那样-顶点向量
V
作为函数对象的一个额外状态包含在内,这是比较两条边所需的。谢谢!它很有效。但是你能给我解释一下吗?我无法理解很好。@Morteza:
.sort
可以接受任何对象
f
,这些对象可以像
f(a,b)
一样被调用。函数是一种明显的类型,但是带有重载
操作符()的类(结构)也是如此
。后者称为函数对象。与普通函数相比,它们的优点是可以存储任意状态,就像这里所做的一样-顶点向量
V
包含在函数对象的额外状态中,这是比较两条边所需的。