33

我想为 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*'”

. 什么是错误?

4

3 回答 3

41

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

它说:

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
  • comp - 如果第一个参数小于第二个参数,则返回 ​<em>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;
});
于 2013-06-03T10:50:26.847 回答
35

std::pair已经具有所需的比较运算符,它们使用每对的两个元素执行字典比较。要使用它,您只需为 typesK和的类型提供比较运算符V

还要记住,这std::sort需要严格的弱排序比较,并且<=不能满足这一点。<例如,您需要对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;
}
于 2013-06-03T10:34:22.680 回答
11

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

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

它不应返回bool正值或负值。Both (bool)1and (bool)-1aretrue所以你的函数说每个对象都在所有其他对象之前排序,这显然是不可能的。

您需要对小于运算符进行建模,而不是对strcmp样式memcmp比较进行建模。

请参阅描述函数必须满足的属性的StrictWeakOrdering 。

于 2013-06-03T10:36:27.847 回答