C++ 如何在c++;对类中的某些值进行排序?
我有一个名为Graph的类,在这个类中我有一个名为V的成员,它是一个向量。我有一个名为Edge的结构和一个Edge列表。如下图所示: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; . .
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
包含在函数对象的额外状态中,这是比较两条边所需的。