【问题标题】:Doesnt stl sort require a strict weak ordering to work?stl sort 不需要严格的弱排序才能工作吗?
【发布时间】:2013-05-25 08:23:30
【问题描述】:

来自http://stdcxx.apache.org/doc/stdlibref/less-equal.html

--

您可以将 less_equal 对象传递给任何需要二进制函数的算法。例如,sort() 算法可以接受二进制函数作为替代比较对象来对序列进行排序。 less_equal 将在该算法中以下列方式使用:

vector<int> vec1;
sort(vec1.begin(), vec1.end(),less_equal<int>());

--

现在我很困惑,上面的文档是否正确?

【问题讨论】:

  • 您可以使用自定义比较器对其进行排序。
  • @chris 你确定吗?我认为如果比较器不是严格的弱顺序,结果可能是不确定的
  • 您是否尝试过向向量添加一些相等的值,然后对其进行排序?通常那是发生断言/异常的时候。你可以传递任何你想要的作为空向量的比较器,因为它永远不会被使用。
  • @RetiredNinja 基于测试的开发是可以的,但是知道正确的行为更好,毕竟可以测试的东西就这么多。
  • @RetiredNinja:是什么让你认为如果失败会得到断言或异常?

标签: c++ stl equality equivalence strict-weak-ordering


【解决方案1】:

你说得对,std::sort 要求比较器定义严格的弱排序。

这意味着std::less_equal 不应与std::sort 一起使用。不过,它仍然可以与许多其他标准算法一起使用,这些算法采用二进制函数并且没有严格的弱排序要求。

【讨论】:

  • 所以 stdcxx 的排序不符合标准并且仍然适用于
  • 鉴于他们声称他们的sort(在this page 的底部)符合标准,那么他们的文档是错误的。你应该使用less_equal
  • @San:你的逻辑是倒退的。如果您确实提供严格的弱排序,则sort 需要工作。如果您不提供严格的弱排序,则将删除对其的所有 要求。不一定要成功,但也不一定要失败。
  • @san 如果您所做的只是对所有不等价的元素进行排序(即x &lt;= yy &lt;= x,但不能同时使用两者),那么您可以使用&lt;= 作为比较器。另请参阅 Scott Meyers 的有效 STL 的第 19 条(“了解等价和相等之间的区别”)。
  • 我有一个问题。为什么 std::sort 需要同时比较 a
猜你喜欢
  • 2010-11-20
  • 1970-01-01
  • 2018-08-04
  • 2018-04-17
  • 2017-01-07
  • 2013-02-14
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多