2015-10-06 78 views
1

我想排序指針數組,但是VS不會編譯,說C++指針比較器不編譯

「的TestClass :: compareItems」:非標準語法;使用 「&」創建一個指針構件

該比較器是這樣的:

bool testClass::compareItems(ElementType *a, ElementType *b) 
{  
    return elementToProfit[a]/a->w() > elementToProfit[b]/b->w(); 
} 

而陣列僅僅是一個正常的陣列。

for (auto &knapsack : knapsacks) 
{  
    std::sort(knapsack.second.begin(), knapsack.second.end(), compareItems); 
} 

我不太清楚發生了什麼事。 VS還抱怨說

'無效的std ::排序(_RanIt,_RanIt)':預計2個論點 - 3提供

我以爲是因爲有與比較器的問題嗎?這應該是超級簡單的...任何幫助非常感謝,謝謝!

+2

什麼是'elementToProfit'?對於你的最後一點,我不確定,但我認爲比較器需要是一個免費函數,而不是某些類的成員函數 – user463035818

+0

...以及爲什麼使用循環對數組進行排序?它應該足夠排序一次(而不是每個元素一次) – user463035818

+0

我想排序許多數組,這只是一個循環在不同的數組。我看到問題出在哪裏,這很有道理。 「elementToProfit」是我想排序的元素之外的額外信息,但我需要排序。我猜這意味着我需要「手工」對它們進行排序,不是嗎,因爲我無法交出額外的信息? –

回答

4

比較函數不能是類的非靜態成員,因爲它不在類的實例上調用。它可以是靜態類功能,獨立功能或functor

通過評論這個問題來判斷,你可能會發現一個函數是最好的前進方向。一個仿函數只是一個實現了operator()的類,這樣你就可以在函數調用語法中使用它的一個對象。這種方法的好處是對象可以包含需要進行比較的其他成員。

typedef std::unordered_map<ElementType*, double> ProfitType; 

class functorClass 
{ 
    ProfitType & elementToProfit; 

public: 
    functorClass(ProfitType & pt) : elementToProfit(pt) {} 

    bool operator()(ElementType *a, ElementType *b) 
    {  
     return elementToProfit[a]/a->w() > elementToProfit[b]/b->w(); 
    } 
}; 

functorClass functor(elementToProfit); 
for (auto &knapsack : knapsacks) 
{  
    std::sort(knapsack.second.begin(), knapsack.second.end(), functor); 
} 
1

的成員函數有一個額外的參數(this指針爲實例),因此你的簽名不匹配 - 的std::sort需要調用的函數,而不一個對象引用。

documentation還聲明它應該滿足binary predicate的要求。

這是一個示例再現

struct ElementType { 
    int w() { 
    return 2; 
    } 
}; 

class testClass { 
public: 
    bool compareItems(ElementType *a, ElementType *b) 
    { 
    return a->w() < b->w(); 
    } 

    void sort() { 

    vector<ElementType*> vecOfPointers; 
    std::sort(vecOfPointers.begin(), vecOfPointers.end(), compareItems); 
    } 

    vector<ElementType*> elementToProfit; 
}; 

Example

您可以通過你的比較函數staticexample)解決您的代碼。

你的第二個錯誤是第一個錯誤的直接後果。解決第一個問題,你也會解決第二個問題。我發現

+0

謝謝,這是完全合理的。我需要外部信息對元素進行排序,這些元素不能提供給比較器,我猜測?一個元素的值存儲在別處,這就是爲什麼。 –

+0

然後使用函子。 – drescherjm

+0

@master_axe對範圍內的變量使用函子或lambda以及一些通過引用進行捕獲。它可能也更具可讀性 –

0

兩個步驟:(假設knapsack.second是向量)

  1. 把它定義爲bool opeator()(...){...};
  2. sort(knapsack.second.begin(), knapsack.second.end(),*this)