2011-11-09 35 views
1

我有這樣的代碼:如何根據struct字段之一對結構指針列表進行排序?

struct nod 
{ 
    nod *vCap; 
    int vCost; 
    char vInfo; 
}; 

list<nod*> vList; 

for (int i = 9; i >= 0; i--) 
{ 
    nod *vTmp; 
    vTmp->vCost=i; 
    vTmp->vInfo='a'; 
    vList.push_back(vTmp); 
} 

我如何排序的vCost值列表?

+3

您的代碼將反正崩潰(如果你是幸運的),因爲在解引用前並不初始化'vTmp',因爲你調用'nod-> vCost'而不是'vTmp-> vCost',所以它甚至不會編譯,爲什麼還要用指針指向'nod' ,而不只是'nod'的值?如果你有這個好理由,沒有問題,如果沒有,你應該深入研究一下C++的基礎知識,記住'std :: list'已經是雙重的鏈接列表 –

回答

5

你需要一個自定義的比較來比較你感興趣的領域:

struct compare_nod_by_cost { 
    bool operator()(nod const * a, nod const * b) { 
     return a->vCost < b->vCost; 
    } 
}; 

然後你就可以將它作爲比較的list::sort

vList.sort(compare_nod_by_cost()); 

在C++ 11中,您可以將其壓縮爲lambda:

vList.sort([](nod const * a, nod const * b) {return a->vCost < b->vCost;}); 

(請注意,您幾乎可以確定要在列表中存儲對象而不是指針;在這種情況下,將比較器的指針參數更改爲引用)。

2

使用lambda:

vList.sort([](const nod * a, const nod * b) { return a->vCost < b->vCost; }); 
+0

錯誤C2143:語法錯誤:缺少')'之前'[' 錯誤C2059:語法錯誤:']' 錯誤C2143:語法錯誤:缺少';'之前'{' 錯誤C2065:'a':未聲明的標識符 錯誤C2227:' - > vCost'的左側必須指向class/struct/union/generic type''未知類型'' 錯誤C2065:'b ':未聲明的標識符 錯誤C2227:' - > vCost'的左側必須指向class/struct/union/generic type type''unknown-type'' 錯誤C2059:語法錯誤:')' – xnl96

+0

我知道它是一個官方的標準已經存在,但由於其相當年輕的存在和編譯器的實現,只是對lambda的C++ 11的一點評論就足夠了。 –

+1

@alex錯誤是由於lambdas是C++ 11功能,您至少需要VS2010。看看Mike對C++ 03解決方案的回答。 –

2

如果一個nod正常或自然順序是由成本,那麼你可能要定義其operator<做到這一點:

struct nod{ 
    nod*vCap; 
    int vCost; 
    char vInfo; 

    bool operator<(nod const &other) { return vCost < other.vCost; } 
}; 

然後,當然,你幾乎可以肯定要創建一個list<nod>代替的一個list<nod*>。完成後,列表中的項目排序將僅爲vList.sort();

只是FWIW,你還需要在你的nod定義來解決一個錯字(你有一個逗號,而不是vCostvInfo的定義之間的分號。

+0

第三個選項有效,謝謝 – xnl96

+0

不錯的想法,但他使用'nod *'列表而不是'nod',所以操作員不會工作。 –

+0

@ChristianRau:是的,這是關鍵的一部分 - 他幾乎肯定會使用點頭表而不是點頭表。 –

相關問題