我知道STL关联容器(以及其他正在排序的容器)使用排序标准来测试相等性。
容器的排序标准默认为st::less,因此将对容器进行相等性测试:
if (! (lhs < rhs || rhs < lhs))或者类似的东西。关于这个我有几个问题..。
首先,这似乎是一种奇怪的低效比较平等的方式-为什么STL要这样做?我原本期望STL容器只需要一个额外的默认参数来表示相等。
我的第二个问题更多地是关于上面的if语句的总体评估。在C++中,有多少语句会被评估(lhs > rhs)是正确的?它会在评估失败的那一侧后停止尝试,从而节省一些效率吗?如果是,那么首先计算表达式的哪个部分?
发布于 2011-11-22 04:00:11
STL关联容器
您的意思是:标准C++排序关联容器。
我本以为
容器只需要一个额外的默认参数来表示相等。
那会有什么效果呢?在教科书中的红黑树算法中,而不是
if (x < y)
// ...
else if (y < x)
// ...
else
// equality你就会有
if (x == y)
// equality
else if (x < y)
// ...
else
// y < x因此,在最坏的情况下,仍然有两个比较。
对此答案的回应是:只需提供一个小于运算符就可以使容器更易于使用,因为不需要维护小于和等于之间的一致性。假设你有一个存储浮点数的程序。有一天,有人决定通过近似比较来替换按位相等的float_equals函数,该函数恰好被一些容器使用,但也被它们的代码使用。如果这个人不更新float_less函数,因为他们的代码不使用该函数,那么您的容器代码就会神秘地崩溃。
(哦,在所示的示例代码中,短路作用一如既往。)
https://stackoverflow.com/questions/8217588
复制相似问题