代码之家  ›  专栏  ›  技术社区  ›  Morteza Milani

如何在C++中使用STL排序来排序类中的一些值?

  •  1
  • Morteza Milani  · 技术社区  · 16 年前

    我有一个名为graph的类,在这个类中我有一个名为v的成员,它是一个向量。我有一个名为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);
      }
    }
    

    但它不起作用!!有人能帮我做这样的事吗?我得到这个错误:

    错误3错误C2064:术语的计算结果不是采用2个参数的函数c:\Program Files\Microsoft Visual Studio 9.0\vc\include\xUtility 346

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

    2 回复  |  直到 16 年前
        1
  •  5
  •   kennytm    16 年前

    不能将成员函数用作比较器。成员函数需要 this 无法从中传递的指针 sort .

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

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

    注意,因为你有一个 Edge 不是 Edge* ,比较器的输入参数应该 不 是 边* . 我把那些换成了 const Edge& .

        2
  •  1
  •   sml    16 年前
    return (V[x->v].dv].d)?1:0;
    

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

    推荐文章