2010-06-05 23 views
1

我有一個名爲Graph的類,在這個類中我有一個名爲V的成員,它是一個向量。我有一個名爲Edge的結構和一個Edges列表。如下所示:如何在C++中使用STL排序來排序類中的某些值?

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文件\微軟的Visual Studio 9.0 \ VC \包括\ xutility 346

它無法理解我調用了需要2個參數的函數。我不知道爲什麼。

+0

下次使用101010按鈕格式化代碼。 – kennytm 2010-06-05 07:57:25

回答

5

您不能使用成員函數作爲比較器。成員函數需要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&

+0

謝謝!有用。但是你可以向我解釋嗎?我無法理解。 – 2010-06-05 08:08:23

+1

@Morteza:'.sort'可以接受任何可以被稱爲'f(a,b)'的對象'f'。函數是它們的一種明顯的類型,但類(結構體)重載'operator()'也是如此。後者被稱爲函數對象。與普通函數相比,它的優點是可以存儲任意狀態,就像這裏所做的那樣 - 頂點矢量「V」被包含作爲函數對象的額外狀態,這是用來比較兩個Edge的。 – kennytm 2010-06-05 08:21:55

1
return (V[x->v].dv].d)?1:0; 

此行有不平衡的括號,是可怕的讀取(前者是後者,我懷疑的結果)。沒有看到你的頂點類,很難說它應該做什麼 - 固定括號後,也許你應該重新格式化的可讀性。

+0

我加了Vertex結構,但事實並非如此。我得到這樣的錯誤: 術語不計算爲一個函數帶2個參數 – 2010-06-05 08:00:47

+0

@Morte嘗試聲明'edgeCmp'爲'static'。此外,您應該將返回類型更改爲'bool'並刪除'1:0'部分。 – fredoverflow 2010-06-05 08:02:47