std :: sort()的c ++自定义比较函数

时间:2013-06-03 10:29:41

标签: c++

我想为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&lt; _Ty1,_Ty2&gt;'中的参数编号'const   无效*'“

。什么是错误?

3 个答案:

答案 0 :(得分:24)

std::pair已经有了必需的比较运算符,它们使用每对元素执行字典比较。要使用此功能,您只需为类型KV的类型提供比较运算符。

另请注意,std::sort需要进行strict weak 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;
}

答案 1 :(得分:20)

请看这里:http://en.cppreference.com/w/cpp/algorithm/sort

它说:

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
  • comp - 比较函数,如果第一个参数小于第二个参数,则返回 true 。比较函数的签名应等同于以下内容:bool cmp(const Type1 &a, const Type2 &b);

此外,这是一个如何使用std::sort使用自定义C ++ 14多态lambda的示例:

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

答案 2 :(得分:10)

您的比较功能甚至没有错。

它的参数应该是存储在范围内的类型,即std::pair<K,V>,而不是const void*

它应该返回bool而不是正值或负值。 (bool)1(bool)-1都是true,因此您的函数说每个对象在每个其他对象之前排序,这显然是不可能的。

您需要为less-than运算符建模,而不是strcmpmemcmp样式比较。

请参阅StrictWeakOrdering,其中介绍了该功能必须满足的属性。