[英]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已經具有所需的比較運算符,它使用每對元素執行字典比較。 要使用它,您只需為類型K
和V
類型提供比較運算符。
還要記住, std::sort
需要嚴格的弱ordeing比較,並且<=
不滿足。 例如,對於K
和V
,您需要小於比較<
。 有了它,你需要的只是
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 );
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運算符建模,而不是strcmp
或memcmp
樣式比較。
請參閱StrictWeakOrdering ,它描述了函數必須滿足的屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.