2013-10-08 99 views
-1

我試圖梳理與類型2D矢量:排序向量C++

vector<pair<char, double>> output; 

我試圖從最高到最低的雙重價值排列並只顯示前5名。這是我我試圖做的:

sort(output.begin(), output.end()); 

但這種方式對我來說工作不正常。我究竟做錯了什麼?

+2

你可能想要定義你自己的比較函子。 –

+0

定義「工作不正常」。向我們展示代碼。 –

+0

另一種可能性是......用一個雙字符對交換char-double對,然後直接對它進行排序...... extra + O(N)time這是無關緊要的,因爲排序是O(NlogN)和額外的O(N)內存...如果你負擔得起。 – 2017-11-28 00:36:44

回答

1

默認情況下,std::sort將使用低於比較運算符用於容器的元件,其將使用char第一然後double執行點逐一比較。

您可以使用自己的排序函數/仿函數,基於對唯一double元素訂單:

bool cmp(const std::pair<char, double>& lhs, 
     const std::pair<char, double>& rhs) 
{ 
    return lhs.second > rhs.second; 
} 

然後

std::vector<std::pair<char, double>> output = ....; 
sort(output.begin(), output.end(), cmp); 

working demo here

+0

我在獲取錯誤 – user977154

+0

錯誤錯誤C3867:'CaesarCypher :: cmp':函數調用缺少參數列表;使用'&CaesarCypher :: cmp'創建一個指向成員 – user977154

+0

@ user977154的指針,你做錯了! 'cmp'函數是一個非成員函數。 – juanchopanza

2

正如紫說,你可能要包括你自己的比較函數:

class compare 
{ 
public: 
    bool operator() (std::pair<char, int> const& p1, 
        std::pair<char, int> const& p2) const 
    { 
     // perform logic here 
    } 
} Predicate; 

std::sort使用operator <的元素比較,並據此排序。它有之比較函子,我們可以包括這樣一個額外的可選參數:

std::sort(output.begin(), output.end(), Predicate); 

注意,這也可以使用C++ 11的拉姆達來完成。

+0

我不確定,但比較器不是一個具有簽名'bool(const value_type&,const value_type&)'的東西(函數,lambda,函子)?我認爲你應該寫'operator()'而不是'operator <' – Manu343726

+0

@ Manu343726這就是這個樣子。 'std :: sort'將在內部調用'compare :: operator <'。 – 0x499602D2

+0

mmmm不,不是可調用對象,您只定義了比較運算符。 – Manu343726

0

您有使用配對向量的原因嗎?換句話說,元素內部存儲的順序對你來說真的很重要嗎?如果沒有,你可能更好的方法是使用帶反向迭代器的map<double,char>來獲得最後5個元素按double值排序。