[英]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.