【问题标题】:C++ STL .. how does custom comparator work?C++ STL .. 自定义比较器如何工作?
【发布时间】:2018-09-07 20:26:31
【问题描述】:

我不明白自定义比较器在 C++ 中的工作原理。幕后究竟发生了什么?

假设我们的比较器 comp(x,y) 有两个参数 xy 我们使用这个比较器函数来假设一个向量vector<int> v (size) 类似于std::sort()priority_queue。 在运行时传递给comp() 的数组元素是按什么顺序排列的...是不是这样-->

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

对于任何类型的自定义比较,规则是什么?听说过弱排序的概念,谁能解释清楚一点吗?

【问题讨论】:

  • 这对en.cppreference.com/w/cpp/concept/Compare有帮助吗?你指的是没有两个参数切换可以返回true(例如comp(a,a)需要返回false,如果comp(a,b)返回true那么comp(b,a)必须返回false)?跨度>
  • @Tas 抱歉,我已经编辑了函数的使用。我的意思是向量或数据结构中元素的顺序——它们是如何输入比较器的。

标签: c++ stl comparator


【解决方案1】:

来自here

comp

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 感谢您解释订购!我认为在第 2 点中,您的意思是对于所有 xy,如果 x < y 为真,y < x 为假。
    【解决方案3】:

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

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

    内部比较(const void * p1, const void * p2); 价值回报意义

    0 p1 引用的项目在 p2 引用的项目之后移动

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 2018-09-07
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      相关资源
      最近更新 更多