C ++ STL ..自定义比较器如何工作?

时间:2018-03-29 01:19:15

标签: c++ stl comparator

我不明白自定义比较器在C ++中是如何工作的......幕后真的发生了什么?

假设我们的比较器x有两个参数ycomp(x,y) 我们使用这个比较器函数让我们说vector<int> v (size)std::sort()之类的向量priority_queue。 在运行时传递给comp()的数组元素的顺序是......就像 - &gt;

comp(v[0],v[1]) 
comp(v[1],v[2])

对于任何类型的自定义比较,有哪些规则?我听说过弱订货概念,有人能解释一下吗?

3 个答案:

答案 0 :(得分:1)

来自here

  

comp

     

二进制函数,它接受范围中的两个元素作为参数,并返回一个可转换为bool的值。返回的值表示作为第一个参数传递的元素是否被认为是在它定义的特定严格弱排序中的第二个参数之前。

     

该函数不得修改其任何参数。

     

这可以是函数指针或函数对象。

换句话说,如果comp(x,y)应该放在结果向量中的x之前,y应该返回true。

编辑:我想我误解了你的问题。向量元素传递给比较器的顺序取决于所使用的算法,这取决于实现,因为标准没有指定精确的算法。我相信quicksort是一种常见的算法。

答案 1 :(得分:1)

除了user9549915的答案中指出的其他属性外,无法保证比较函数的使用方式,但它必须满足strict weak ordering

定义严格弱排序的函数类似于通常的小于(<)运算符:

  1. 对于所有xx < x为假。
  2. 对于所有xy,如果x < y为真,则y < x为false。
  3. 对于所有xyz,如果x < yy < z都为真,则x < z必须为真。< / LI>

    为方便阅读,我使用x < y代替comp(x, y)

答案 2 :(得分:-3)

保存可用于对矩阵进行排序的标准C库qsort()。顾名思义,该函数使用QuickSort算法对指定的数组进行排序。以下是qsort()

的示例

void qsort(void * base,size_t num,size_t size, int(* comparator)(const void *,const void *)); 关于qsort()的要点是比较函数比较。比较函数接受两个参数,并包含一个逻辑,用于确定已排序的输出中的相对顺序。我们的想法是提供灵活性,以便qsort()可以用于任何类型(包括用户定义的类型),并可用于获取任何所需的顺序(增加或减少或其他任何)。 比较函数将两个索引作为一个大小(都绑定到const星座*)并确定要返回的元素的顺序(以常数和多种方式)

内部比较(const void * p1,const void * p2); 价值回报意义 &lt; 0 p1引用的项目位于p2引用的元素之前 0 p1中引用的元素等于p2

中引用的元素
  

0 p1引用的项目在p2

引用的项目之后移动