簡體   English   中英

std :: sort()的c ++自定義比較函數

[英]c++ custom compare function for std::sort()

我想為std :: sort()創建自定義比較函數,以對一些鍵值對std :: pair進行排序

這是我的功能

 template <typename K, typename V>
 int comparePairs(const void* left, const void* right){
        if((((pair<K,V>*)left)->first) <= (((pair<K,V>*)right)->first))
            return 1;
        else 
            return -1;
    }

然后,在一些類里面我有對類成員的向量:

vector<pair<K,V>> items;  

以及使用std :: sort()按鍵對此向量進行排序的一些方法

std::sort(items.begin(), items.end(), comparePairs<K,V>);

我內部有編譯錯誤,其中說

“無法將參數編號從'std :: pair <_Ty1,_Ty2>'轉換為'const void *'”

什么是錯誤?

std :: pair已經具有所需的比較運算符,它使用每對元素執行字典比較。 要使用它,您只需為類型KV類型提供比較運算符。

還要記住, std::sort需要嚴格的弱ordeing比較,並且<=不滿足。 例如,對於KV ,您需要小於比較< 有了它,你需要的只是

std::vector<pair<K,V>> items; 
std::sort(items.begin(), items.end()); 

如果你真的需要提供自己的比較功能,那么你需要一些東西

template <typename K, typename V>
bool comparePairs(const std::pair<K,V>& lhs, const std::pair<K,V>& rhs)
{
  return lhs.first < rhs.first;
}

請看這里: http//en.cppreference.com/w/cpp/algorithm/sort

它說:

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
  • 排版 -比較函數,如果所述第一參數小於所述第二返回true。 比較函數的簽名應該等同於以下內容: bool cmp(const Type1 &a, const Type2 &b);

另外,這是一個如何使用自定義C ++ 14多態lambda使用std::sort的示例:

std::sort(std::begin(container), std::end(container),
          [] (const auto& lhs, const auto& rhs) {
    return lhs.first < rhs.first;
});

你的比較功能甚至沒有錯。

它的參數應該是存儲在范圍內的類型,即std::pair<K,V> ,而不是const void*

它應該返回bool而不是正值或負值。 (bool)1(bool)-1都是true所以你的函數說每個對象都在每個其他對象之前排序,這顯然是不可能的。

您需要為less-than運算符建模,而不是strcmpmemcmp樣式比較。

請參閱StrictWeakOrdering ,它描述了函數必須滿足的屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM