【发布时间】: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