Как я могу использовать сортировку STL в C ++ для сортировки некоторых значений в классе? - PullRequest
1 голос
/ 05 июня 2010

У меня есть класс с именем Graph, в этом классе у меня есть член с именем V, это вектор. У меня есть структура с именем Edge и список Edges. как показано ниже:

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 ]

5 голосов
/ 05 июня 2010

Вы не можете использовать функцию-член в качестве компаратора. Функция-член нуждается в указателе 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*, входные аргументы компаратора должны не быть Edge*. Я изменил их на const Edge&.

1 голос
/ 05 июня 2010
return (V[x->v].dv].d)?1:0;

Эта строка имеет несбалансированные скобки и ужасно читается (первая является следствием последней, я подозреваю). Не видя своего класса Vertex, трудно сказать, что он должен делать - после исправления скобок, возможно, вам следует переформатировать для удобства чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...