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

c++ custom compare function for std::sort()

本文关键字:c++ 自定义 比较 函数 std sort 用于      更新时间:2023-10-16

我想为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;  

和一些按键排序vector的方法,使用std::sort()

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

里面有编译错误,上面写着

"无法将参数number从'std::pair<_Ty1,_Ty2>'转换为'const 'void *"

。什么是错误?

看这里: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);

另外,这里有一个如何使用自定义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已经有了所需的比较操作符,它使用每个pair的两个元素执行字典顺序比较。要使用它,您只需要为类型KV提供类型的比较运算符。

还要记住,std::sort要求严格弱序比较,而<=不满足这一点。例如,您需要对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;
}

你的比较函数根本没有错。

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

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

您需要建模小于操作符,而不是strcmpmemcmp风格的比较。

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