【问题标题】:STL functions with 3-way comparison predicate具有 3 路比较谓词的 STL 函数
【发布时间】:2011-08-30 11:54:42
【问题描述】:

是否有任何具有 STL 函数的库,如 std::sort()std::binary_search()std::lower_bound()std::upper_bound() 接受 3 路比较谓词(在较少时返回 -1,在相等时返回 0,在大时返回 1)而不是less 谓词(在 less 上为 true,在 equal 或 great 上为 false)?

当然,less 谓词可以很容易地从现有的 3 向谓词(如 [](A a, B b) { return compare3(a,b)<0; })中提取出来,但这会导致对谓词的调用次数增加。

【问题讨论】:

  • 有什么意义?无论如何,您必须测试两次返回值。这些谓词不应该很重,它们应该简单且内联,这样重复调用就不会受到惩罚。
  • 重点是:要检查的谓词结果是int,测试起来很便宜(更重要的是,检查int为0可以被编译器优化成一张支票)。比较对象可以是任意重的(字符串、复杂对象)。
  • @user222202 - 什么算法会利用这个三重检查?
  • @user222202: *_bound 不能,因为如果这样做会返回错误的结果。关于binary_search,请参阅 Knuths “编程的艺术”,详细分析为什么这种“优化”具有可疑的价值。
  • @user222202 - 您知道 STL 是一个通用库,具有任何人都可以使用并期望合理(预定义)性能的通用算法吗?您始终可以实现根据您的要求优化的算法并让它们表现得更好,但您不能指望通用库中的它,因为对您而言的优化正在破坏您不关心的其他人的结果。通用库无法做到这一点。

标签: c++ sorting stl binary-search lower-bound


【解决方案1】:

如果你查看上述算法的实现,你会发现 lower/upper_bound 根本不做 3 路分支,binary_search 只在最后一次迭代中检查相等性,而关于 sort() 我不'不知道,但我几乎可以肯定它也不会做 3 路分支。所以你的“优化”不会给你任何提升。反之亦然,你的比较会比较慢。

【讨论】:

  • 这就是为什么我正在寻找适合(并特别优化)与 3 路谓词一起使用的实现。
  • @user222202 换句话说:大多数基于比较的算法只需要相等== 或小于< 来进行超过 90% 的比较。这是算法的属性,而不是实现。
  • @user2222202:事实上,对于某些算法(lower_bound),C++ 标准只需要定义(*iter
  • @ybungalobill, binary_search 必须在比较返回 false 时使用交换参数进行第二次调用(通常为 50% 的情况)。所以必须二叉树搜索mapset。这是因为应该插入移除的元素必须是标识的。另一方面,对于sort(),我认为这并不重要,因为您需要做的就是正确的a[i] < a[j]i > j
  • @JoSo:这根本不是真的。该标准还要求最多进行log2(N) + O(1) 比较。见reference implementation here。我还记得 Knuth 在 TAOCP 第 3 卷中对其进行了很好的描述。
猜你喜欢
  • 1970-01-01
  • 2015-09-01
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 2018-10-23
相关资源
最近更新 更多