【问题标题】:Custom compare function for std::sort() C++std::sort() C++ 的自定义比较函数
【发布时间】:2020-10-02 05:57:32
【问题描述】:

很多时候我必须使用自定义比较功能进行排序。 我可以实现它,但有时我会犯错误。如果它返回true,我通常会感到困惑,那么它是否会被交换?有人可以解释如果它返回true 会发生什么,如果它返回false 会怎样?

【问题讨论】:

  • 你读过std::sort的文档吗? "比较函数对象(即满足比较要求的对象),如果第一个参数小于(即排在前面)第二个参数,则返回true"
  • 一个比较器,返回 truefalse 总是不能与 std::sort 一起使用(没有严格的弱排序)。我想你的意思是a < b 通常意味着比较器返回true,与之相反的是b <= a,它作为比较器也无效。请澄清您的问题
  • 请不要破坏您的帖子。通过在 Stack Exchange 网络上发帖,您已在 CC BY-SA 4.0 license 下授予 Stack Exchange 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本,因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work?
  • @largest_prime_is_463035818 这个问题非常简单明了,Algirdas 搞定了。不要把它复杂化,它会带来混乱。

标签: c++ sorting std compare-and-swap


【解决方案1】:

如果它返回true,我通常会感到困惑,那么它是否会被交换?

这无关紧要,而且您不需要(不需要)知道。

唯一相关的是比较器应该返回true当且仅当第一个参数严格小于第二个参数(即它应该在之前,排序后)。换句话说,它应该返回与< 逻辑上相同的结果。

【讨论】:

  • 但在自定义比较器中,您是决定哪个少哪个多的人。假设你有一个函数static bool comp(string a, string b){ if(isdigit(a[0]))return true; else return false; },是返回 true 交换字符串还是返回 false 交换字符串?
  • @DeusEx 两者都不是。这不是一个有效的小于关系。它违反了std::sort 等强加的strict weak ordering 合约,它会破坏这些功能。
【解决方案2】:

自定义比较功能不会交换内容,也不会在应该进行交换时发出信号。这是算法的工作,您无需担心。

自定义比较函数比较事物。这是您告诉算法哪些元素被视为“小于”其他元素的方式。这就是它需要你告诉它的所有内容,它才能启动并完成它的分类工作。

阅读文档/您的书以了解您使用的功能。 std::sort的要求可以免费学习:

comp:比较函数对象(即满足Compare要求的对象)如果第一个参数小于则返回​true (即在 之前排序)第二个。

【讨论】:

  • 但在自定义比较器中,您是决定哪个少哪个多的人。假设你有一个函数static bool comp(string a, string b){ if(isdigit(a[0]))return true; else return false; },是返回 true 交换字符串还是返回 false 交换字符串?
  • @DeusEx 两者都不是。比较器无法确定何时发生交换。该算法确实如此。不是shallISwapTheseThings;这是shallIDeemThisThingToBeLessThanThisOtherThing。我建议研究排序算法的工作原理。
  • 我们不只是在争论技术性吗?排序算法进行交换,但比较器定义了 ,算法将交换 a 和 b
  • @DeusEx 在那个非常简单的例子中是的,但是这两件事没有直接联系,在一个真实的用例中你会看到更多的场合return true可能或根据排序算法的状态,可能不会导致交换。将比较器描述为完全按照它所做的事情(定义排序顺序)来描述比较器要比将事情与其他任何事情混淆起来要准确得多(也容易得多)。
  • @DeusEx 如果我告诉你“你要找的房子在田地旁边”,当然有时这可能意味着“左转”,但并非总是如此,因为这取决于你的方向旅行,所以我们只说 哪里 房子在哪里,而不是如何到达那里。您的卫星导航(或者,理想情况下是大脑!)负责计算方向。
猜你喜欢
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
相关资源
最近更新 更多